POJ 3268 Silver Cow Party 2个dijkstra
写2个dijkstra,一个逆向一个顺向
View Code
#include<stdio.h> #include<string.h> #define maxn 1001 #define INF 100000000 int dis[maxn],adj[maxn][maxn],d[maxn]; bool vis[maxn]; int m, n; void dijkstra(int v) //顺向 { int i ,j ,k, u, min; for(i=0;i<=n;i++) { dis[i]=adj[v][i]; vis[i]=0; } vis[v]=1;dis[v]=0; for(i=1;i<n;i++) { min =INF; for(j=1;j<=n;j++) { if(min > dis[j]&&!vis[j]) { min = dis[j]; u = j; } } if(min == INF)break; vis[u] = 1; for(j=1;j<=n;j++) { if(!vis[j]&&dis[u]+adj[u][j] < dis[j]) { dis[j] = dis[u] +adj[u][j]; } } } } void dijkstra2(int v) //逆向 { int i, j ,k, u, min; for(i=0;i<=n;i++) { vis[i]=0; d[i]=adj[i][v]; } vis[v]=1;dis[v]=0; for(i=1;i<=n;i++) { min =INF; for(j=1;j<=n;j++) { if(min > d[j]&&!vis[j]) { min = d[j]; u = j; } } if(min == INF)break; vis[u]=1; for(j=1;j<=n;j++) { if(!vis[j]&&d[u] + adj[j][u] < d[j]) { d[j] = d[u] + adj[j][u]; } } } } int main() { int x,y, w,i,j,s,t; while(~scanf("%d%d%d",&n,&m,&t)) { for(i=0;i<=n;i++) { for(j=0;j<=n;j++) adj[i][j]=INF; } while(m--) { scanf("%d%d%d",&x,&y,&w); if(adj[x][y] > w) { adj[x][y]=w; } } int max = - INF; dijkstra(t); dijkstra2(t); for(i=1;i<=n;i++) { if(i==t)continue; if(d[i]==INF||dis[i]==INF)continue; if(max < d[i] + dis[i])max =d[i]+dis[i]; } printf("%d\n",max); } return 0; }


浙公网安备 33010602011771号