正反两边spfa,最后取个max就可以了。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=2e5,M=2e3+5; int head[N],next[N],go[N],v[N],tot=0; int dis[M],vis[M],h[M],n,m,k,fa[N]; int ans[N]; typedef long long ll; inline void add(int x,int y,int z) { go[++tot]=y; v[tot]=z; next[tot]=head[x]; head[x]=tot; } inline void spfa(int s) { memset(dis,127,sizeof(dis)); int t=0,w=1; dis[s]=0; h[t]=s;vis[s]=1; while (t!=w) { int x=h[t++]; int i=head[x]; while (i) { int to=go[i]; if (dis[to]>dis[x]+v[i]) { dis[to]=dis[x]+v[i]; if (!vis[to]) { vis[to]=1; h[w++]=to; } } i=next[i]; } vis[x]=0; } } int main() { scanf("%d%d%d",&n,&m,&k); fo(i,1,m) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } fo(i,1,n) { spfa(i),ans[i]=dis[k]; } spfa(k); int mx=0; fo(i,1,n)mx=max(mx,dis[i]+ans[i]); printf("%d\n",mx); return 0; } 