Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1373 Accepted Submission(s): 988
5 1 0 1 1 2 0 2 3 3 1 1 1 4 100 0 1 0 1
2这道题主要就是题意的理解,首先输出小镇的数目,从0-n-1小镇开始,首先输入路的数目,然后是小镇的位置,如果是0,只要后面的距离就行;如果是1,将该小镇统计到数组中。然后是m条路,以及对应的时间;最短路径遍历一边就行了;,从0开始找最短路径,所以这里用dijkstra算法比较简单。#include<cstdio> #include<cstring> #define INF 0x3f3f3f int map[20][20],dis[20],n; int vis[20]; void dijkstar() { int i,j; for(i=0;i<n;i++) { dis[i]=map[0][i]; } memset(vis,0,sizeof(vis)); vis[0]=1; for(i=0;i<n;i++) { int M=INF,k=-1; for(j=0;j<n;j++) { if(!vis[j]&&M>dis[j]) { k=j; M=dis[j]; } } if(k==-1) return ; else vis[k]=1; for(j=0;j<n;++j) { if(!vis[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } } } int main() { int i,j,end[10],num,d,k,sea,place; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;++i) { for(j=0;j<n;++j) { if(i==j) map[i][j]=0; else map[i][j]=INF; } } k=0; for(i=0;i<n;++i) { scanf("%d%d",&num,&sea); if(sea) end[k++]=i;//将在海边小镇存入数组 for(j=0;j<num;++j) { scanf("%d%d",&place,&d); if(map[i][place]>d) map[i][place]=d;//注意是单向图 } } dijkstar(); int ans=INF; for(i=0;i<k;++i)//找到到海边最短的路径权值 { if(dis[end[i]]<ans) ans=dis[end[i]]; } printf("%d\n",ans); } return 0; }