hdu2923+floyd
也没啥好讲的。字符串模拟出图后直接floyd,水题+1。
1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 map<string,int> mmap; 8 int n,c,r; 9 int g[110][110]; 10 const int mmax=10000005; 11 int main() 12 { 13 int i,j,d[1100],dnum,k,numcas=0; 14 while(scanf("%d%d%d",&n,&c,&r)!=EOF) 15 { 16 if(n==0&&c==0&&r==0) break; 17 for(i=0;i<n;i++) 18 for(j=0;j<n;j++) 19 g[i][j]=mmax; 20 for(i=0;i<n;i++) 21 g[i][i]=0; 22 mmap.clear(); 23 string str; 24 int cnt=0; 25 dnum=0; 26 for(i=0;i<c+1;i++) 27 { 28 cin>>str; 29 if(mmap.count(str)==0) 30 mmap[str]=cnt++; 31 if(i!=0) 32 d[dnum++]=mmap[str]; 33 } 34 for(i=0;i<r;i++) 35 { 36 string city1,op,city2; 37 cin>>city1>>op>>city2; 38 if(mmap.count(city1)==0) 39 mmap[city1]=cnt++; 40 if(mmap.count(city2)==0) 41 mmap[city2]=cnt++; 42 int num1=mmap[city1]; 43 int num2=mmap[city2]; 44 int w=0; 45 for(j=2;;j++) 46 { 47 if(op.at(j)>='0'&&op.at(j)<='9') 48 w=w*10+op.at(j)-'0'; 49 else break; 50 } 51 if(op.at(0)=='<') 52 { 53 if(w<g[num2][num1]) 54 g[num2][num1]=w; 55 } 56 if(op.at(op.length()-1)=='>') 57 { 58 if(w<g[num1][num2]) 59 g[num1][num2]=w; 60 } 61 } 62 //以上构图 63 for(k=0;k<n;k++) 64 for(i=0;i<n;i++) 65 for(j=0;j<n;j++) 66 g[i][j]=min(g[i][j],g[i][k]+g[k][j]); 67 int ans=0; 68 for(i=0;i<c;i++) 69 ans=ans+g[0][d[i]]+g[d[i]][0]; 70 printf("%d. %d\n",++numcas,ans); 71 } 72 return 0; 73 }