ZOJ 3166 Lazy Tourist 最短路floyd模版题
典型的水floyd
View Code
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; #define INF 1000000 #define maxn 1001 int adj[maxn][maxn],dis[maxn][maxn],pos[maxn]; int n, m, num; void floyd() { int i ,j ,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) dis[i][j]=adj[i][j]; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(k!=i&&k!=j) if(dis[i][k]+dis[k][j]<dis[i][j]) dis[i][j]= dis[i][k]+dis[k][j]; } void work() { floyd(); int i, j, k, v, min; v=-1;min = INF; for(k=0;k<num;k++) { int u=pos[k]; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(u!=i&&u!=j) if(dis[i][u]+dis[u][j]+dis[j][i]<min &&dis[j][i]!=INF) { min = dis[i][u]+dis[u][j]+dis[j][i]; v = u; } } if(v == -1)printf("I will nerver go to that city!\n"); else printf("%d\n",v); } int main() { int i ,j, x, y, w; while(~scanf("%d%d",&n,&num)) { for(i=0;i<num;i++) scanf("%d",&pos[i]); sort(pos,pos+num); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j)adj[i][j]=INF; else adj[i][j]=0; scanf("%d",&m); while(m--) { scanf("%d%d%d",&x,&y,&w); if(adj[x][y]>w)adj[x][y]=w; } work(); } return 0; }


浙公网安备 33010602011771号