http://acm.hdu.edu.cn/showproblem.php?
pid=2066
/*主要思路就是把小草家看做源点0,然后和小草家相近的城市到源点距离为0,这样就妥妥的变成了单源的dijkstra。就基本上是模板了。。。。。。。
*/
#include<cstdio> #define N 1005 #define INF 0xfffffff int map[N][N],dis[N],vis[N],n; void dijkstra() { int i,j; for(i=1;i<=n;i++) { dis[i]=map[0][i];//出发点到各个地点的距离 vis[i]=false;//标记还没走 } for(i=1;i<=n;i++) { int t=INF; int k; for(j=1;j<=n;j++) { if(!vis[j]&&t>dis[j]) { t=dis[j]; k=j; } } vis[k]=true; for(j=1;j<=n;j++) { if(!vis[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } } printf("%d ",dis[n]); } int main() { int t,s,d,i,j,k,a,b,c; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { for(i=0;i<N;i++) for(j=0;j<N;j++) { map[i][j]=INF; } n=0;//统计有几个地方 for(i=1;i<=t;i++) { scanf("%d%d%d",&a,&b,&c); if(c<map[a][b]) map[a][b]=map[b][a]=c;//保存路径的最小值,路径可能是双向 的。而且可能还有反复 if(n<a) n=a; if(n<b) n=b; } n++;//注意,地方数加1,即到了终点 for(i=0;i<s;i++) { scanf("%d",&a); map[0][a]=map[a][0]=0;//出发点都相邻城市时间为0 } for(i=0;i<d;i++) { scanf("%d",&a); map[a][n]=map[n][a]=0;//终点到想去的地方路径长度为0 } dijkstra(); } return 0; }
// Floyd #include "stdio.h" #include "string.h" const int inf = 1000000; int map[1115][1115]; int max_city; bool mark1[1005],mark2[1005]; int Floyd() { int temp=inf; for( int k=1;k<=max_city;k++ ) { for( int i=1;i<=max_city;i++ ) { if( map[i][k]!=inf ) for( int j=1;j<=max_city;j++ ) { if( map[i][j] > map[i][k] + map[k][j] ) { map[i][j] = map[i][k] + map[k][j]; } if( mark1[i] && mark2[j] ) temp=temp<map[i][j]?temp:map[i][j]; } } } return temp; } int main() { int t,s,d,a,b,c,i,j,temp; while( scanf("%d%d%d",&t,&s,&d)==3 ) { for( i=0;i<1005;i++ ) for( j=i+1;j<=1005;j++ ) map[i][j]= map[j][i] = inf; max_city=0; for( i=0;i<t;i++ ) { scanf("%d%d%d",&a,&b,&c); if( map[a][b]>c ) map[a][b]=map[b][a]=c; max_city=(a>b ? a:b) > max_city ? (a>b?a:b) : max_city; } memset(mark1,0,sizeof(mark1)); memset(mark2,0,sizeof(mark2)); for( i=0;i<s;i++ ) { scanf("%d",&temp); mark1[temp]=true; } for( i=0;i<d;i++ ) { scanf("%d",&temp); mark2[temp]=true; } printf("%d ",Floyd()); } return 0; }