题目链接:
http://poj.org/problem?id=3268
题意:
先求出所有牛到x的最短路,再求出x到所有牛的最短路,两者相加取最大值(单向图)(可以用迪杰斯特拉,SPFA)
迪杰斯特拉:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> #include<vector> using namespace std; #define N 1005 #define INF 0xfffffff int n, m, x; int a, b, t; int G[N][N], dist1[N], dist2[N]; bool vis1[N], vis2[N]; void IN() { memset(vis1, false, sizeof(vis1)); memset(vis2, false, sizeof(vis2)); for(int i=1; i<=n; i++) { dist1[i]=INF; dist2[i]=INF; for(int j=1; j<=i; j++) G[i][j]=G[j][i]=INF; } } void DIJ1() { dist1[x]=0; for(int i=1; i<=n; i++) { int index=1, MIN=INF; for(int j=1; j<=n; j++) { if(!vis1[j] && dist1[j]<MIN) { index=j, MIN=dist1[j]; } } vis1[index]=1; for(int j=1; j<=n; j++) { dist1[j]=min(dist1[j], dist1[index]+G[index][j]); } } } void DIJ2() { dist2[x]=0; for(int i=1; i<=n; i++) { int index=1, MIN=INF; for(int j=1; j<=n; j++) { if(!vis2[j] && dist2[j]<MIN) { index=j, MIN=dist2[j]; } } vis2[index]=1; for(int j=1; j<=n; j++) { dist2[j]=min(dist2[j], dist2[index]+G[j][index]); } } } int main() { while(scanf("%d%d%d", &n, &m, &x)!=EOF) { IN(); for(int i=0; i<m; i++) { scanf("%d%d%d", &a, &b, &t); G[a][b]=t; } DIJ1(); DIJ2(); int ans=0; for(int i=1; i<=n; i++) ans=max(ans, dist1[i]+dist2[i]); printf("%d ", ans); } return 0; }