标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3031 Accepted Submission(s):
940
n 个地点(包括公司的车库),c 表示c辆车抛锚的地点, r 条道路
第二行给出 c+1 个地点,第一个为车库地点, 其余的 c 个为车的地点。
接下来的 r 行表示 r 条有向的道路,
s1 -- d -> s2 表示 s1到s2 的长度为 d
s1 <- d -- s2 表示 s2到s1 的长度为 d
s1 <- d -> s2 表示 s1到s2为双向边, 且长度为 d
拖车从车库出发到每个地点,在该地点拖回抛锚的车子。一辆拖车一次只能拖回一辆车子。注意:同一个地点可能有多辆抛锚的车子求总的路径长度。还要输出 case number
附上代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <map> 5 #define inf 0x3f3f3f3f 6 #define M 105 7 using namespace std; 8 int n,c,m,t; 9 int maps[M][M]; 10 char str[1005][M]; 11 map<string,int> mat; 12 13 void floyd() //小于100,使用floyd处理 14 { 15 int i,j,k; 16 for(k=1; k<=n; k++) 17 for(i=1; i<=n; i++) 18 for(j=1; j<=n; j++) 19 if(maps[i][j]>maps[i][k]+maps[k][j]) 20 maps[i][j]=maps[i][k]+maps[k][j]; 21 } 22 23 int main() 24 { 25 int i,j,s,x,y,start,Case=1; 26 char s1[M],s2[M]; 27 char from,to; 28 while(~scanf("%d%d%d",&n,&c,&m)) 29 { 30 if(!n&&!m&&!c) 31 break; 32 int sum=0; 33 mat.clear(); //map函数清空 34 for(i=0; i<=n; i++) 35 for(j=0; j<=n; j++) 36 if(i==j) maps[i][j]=0; 37 else maps[i][j]=inf; 38 for(i=0; i<=c; i++) 39 scanf("%s",str[i]); 40 t=1; 41 for(i=0; i<m; i++) 42 { 43 scanf("%s %c-%d-%c %s",s1,&from,&s,&to,s2); //注意这里的输入 44 if(!mat[s1]) mat[s1]=t++; //运用了map函数,假如s1不在mat中,则存入,并加1 45 if(!mat[s2]) mat[s2]=t++; 46 x=mat[s1],y=mat[s2]; 47 if(from==‘<‘&&s<maps[y][x]) 48 maps[y][x]=s; 49 if(to==‘>‘&&s<maps[x][y]) 50 maps[x][y]=s; 51 } 52 floyd(); 53 start=mat[str[0]]; //找寻起点在mat中存储的位置 54 for(i=1; i<=c; i++) 55 sum+=maps[start][mat[str[i]]]+maps[mat[str[i]]][start]; //注意去和回!! 56 printf("%d. %d\n",Case++,sum); 57 } 58 return 0; 59 }
标签:
原文地址:http://www.cnblogs.com/pshw/p/5435645.html