/* 题目大意是:某个城市有n个路口,r条道路(有单向的和双向的),c辆车坏了,求一辆一辆地把坏车拖回来需要走多长的距离 因为是多源最短路(拖车公司和坏车的地点都作为源点)问题,用Floyd */ #include<stdio.h> #include<string> #include<string.h> #include<map> using namespace std; int maze[110][110],xiu[1010]; map<string,int>name; int n,c,r,s,no,num=1; char nam1[30],nam2[30],fang[30]; void floyd() { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(maze[i][j]>maze[i][k]+maze[k][j]) maze[i][j]=maze[i][k]+maze[k][j]; } int main() { int i,j,k; while(scanf("%d%d%d",&n,&c,&r),n+c+r) { no=1; getchar(); name.clear(); for(i=1;i<=n;i++) for(j=1;j<=n;j++) maze[i][j]=(i!=j)*999999999; scanf("%s",nam1); name[nam1]=no++; s=1; for(i=1;i<=c;i++) { scanf("%s",nam1); k=name[nam1]; if(!k) { k=no++; name[nam1]=k; } xiu[i]=k; } for(i=1;i<=r;i++) { scanf("%s %s %s",nam1,fang,nam2); int p,q,o; p=name[nam1]; if(!p) { p=no++; name[nam1]=k; } q=name[nam2]; if(!q) { q=no++; name[nam2]=q; } sscanf(fang+2,"%d",&o); if(fang[0]=='<') { if(maze[q][p]>o)//不知道为啥非得有这个判断;开始的时候都初始化过了; //除非直接连接两路口的路不只一条,需要更新到最小值 maze[q][p]=o; } if(fang[strlen(fang)-1]=='>') { if(maze[p][q]>o) maze[p][q]=o; } } floyd(); int max=0; for(i=1;i<=c;i++) max+=(maze[s][xiu[i]]+maze[xiu[i]][s]); printf("%d. %d\n",num++,max); } return 0; }