http://acm.hdu.edu.cn/showproblem.php?pid=2066
裸最短路,一开始又sb了,处理错复杂度TLE,囧
View Code
#include <stdio.h> #include <string.h> const int INF=1000000001; const int maxn=1001; int G[maxn][maxn]; int dis[maxn]; int vis[maxn]; int node1[maxn],node2[maxn]; int n; void Dijkstra(int s) { memset(vis,0,sizeof(vis)); for(int i=0;i<=n;i++) dis[i]=INF; dis[s]=0; for(int i=0;i<n;i++) { int ans=INF,u; for(int j=1;j<=n;j++) if(!vis[j] && dis[j]<ans) { ans=dis[j]; u=j; } vis[u]=1; for(int j=1;j<=n;j++) if(!vis[j] && G[u][j]+dis[u]<dis[j]) dis[j]=G[u][j]+dis[u]; } } int main() { int T,S,D; while(~scanf("%d%d%d",&T,&S,&D)) { int a,b,time; for(int i=0;i<1001;i++) for(int j=0;j<1001;j++) G[i][j]=INF; n=0; while(T--) { scanf("%d%d%d",&a,&b,&time); if(G[a][b]>time) G[a][b]=G[b][a]=time; if(n<a)n=a; if(n<b)n=b; } for(int i=1;i<=S;i++) scanf("%d",&node1[i]); for(int i=1;i<=D;i++) scanf("%d",&node2[i]); int ans=INF; for(int i=1;i<=S;i++) { Dijkstra(node1[i]); int minn=INF; for(int j=1;j<=D;j++) if(dis[node2[j]]<minn)minn=dis[node2[j]]; if(ans>minn)ans=minn; } printf("%d\n",ans); } return 0; }