正反跑两遍spfa
#include<iostream> #include<cstdlib> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> #include<iomanip> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f; } struct data{int fr,nt,be,to,val;}edge[100010]; int n,m,head[1010],hd[1010],ecnt,maxn=-0X3f3f3f3f;; inline void add(int u,int v,int val) {edge[++ecnt]=(data){u,head[u],hd[v],v,val};head[u]=ecnt;hd[v]=ecnt;} int dis[1010],d[1010]; void spfa(int k) { memset(dis,0X3f,sizeof(dis)); memset(d,0X3f,sizeof(d)); d[k]=dis[k]=0; int q[10000],h=1,t=2;q[h]=k;bool inq[2010];inq[k]=1; while(h<t) { int now=q[h];h++;inq[now]=0; for(int i=head[now];i;i=edge[i].nt) { int v=edge[i].to; if(dis[v]>dis[now]+edge[i].val) { dis[v]=dis[now]+edge[i].val; if(!inq[v]){q[t++]=v;inq[v]=1;} } } } memset(inq,0,sizeof(inq));memset(q,0,sizeof(q)); h=1,t=2;q[h]=k;inq[k]=1; while(h<t) { int now=q[h];h++;inq[now]=0; for(int i=hd[now];i;i=edge[i].be) { int v=edge[i].fr; if(d[v]>d[now]+edge[i].val) { d[v]=d[now]+edge[i].val; if(!inq[v]){q[t++]=v;inq[v]=1;} } } } for(int i=1;i<=n;i++) maxn=max(maxn,dis[i]+d[i]); } int main() { int k;scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) {int x=read(),y=read(),val=read();add(x,y,val);} spfa(k); cout<<maxn; }