HDU2923:Einbahnstrasse(Floyd)
来源:互联网 发布:阴阳师妖狐cos淘宝 编辑:程序博客网 时间:2024/05/16 08:21
#include <iostream> #include <stdio.h> #include <cstring> #include <map> #include <algorithm> using namespace std; #define inf 999999999 const int L = 1005; int n,c,m; int a[105][105]; char str[1005][100]; int cnt; map<string,int> mat; void Floyd() { int i,j,k; for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) for(k = 1; k<=n; k++) if(a[j][i]+a[i][k]<a[j][k]) a[j][k] = a[j][i]+a[i][k]; } int main() { int i,j,val,x,y,len,cas = 1,sum,start; char s1[100],s2[100],s3[100]; char from,to; while(~scanf("%d%d%d",&n,&c,&m)&&(n+c+m)) { sum = 0; mat.clear(); for(i = 0; i<=n; i++) for(j = 0; j<=n; j++) a[i][j] = inf; for(i = 0; i<=c; i++) scanf("%s",str[i]); cnt = 1; for(i = 0; i<m; i++) { scanf("%s %c-%d-%c %s",s1,&from,&val,&to,s3); if(!mat[s1]) mat[s1] = cnt++; if(!mat[s3]) mat[s3] = cnt++; x = mat[s1],y = mat[s3]; if(from == '<' && val<a[y][x]) a[y][x] = val; if(to == '>' && val<a[x][y]) a[x][y] = val; } Floyd(); start = mat[str[0]]; for(i = 1; i<=c; i++) sum+=a[start][mat[str[i]]]+a[mat[str[i]]][start]; printf("%d. %d\n",cas++,sum); } return 0; }