QAQ 有两个操作,一个是单源最短路的起点,一个是单源最短路的终点,前一个好说,直接以x为起点跑SPFA就行了,至于后一个,我们只需要把路反过来建,然后在跑一边SPFA就行了233
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cstring> using namespace std; int head[9999],to[200000],cost[200000],net[200000]; int dis[9999],f[9999]; int dis2[9999]; int d[9999]; int cnt; int head2[9999],to2[200000],cost2[200000],net2[200000]; int cnt2; void add(int x,int y,int z) { cnt++; to[cnt]=y; cost[cnt]=z; net[cnt]=head[x]; head[x]=cnt; } void add2(int x,int y,int z) { cnt2++; to2[cnt2]=y; cost2[cnt2]=z; net2[cnt2]=head2[x]; head2[x]=cnt2; } int n,m,s; int maxf1; void spfa1(int s) { memset(dis,127,sizeof(dis)); dis[s]=0; d[1]=s; f[s]=1; int h=0,tail=1; do { h++; int dd=d[h]; f[dd]=0; for(int i=head[dd];i;i=net[i]) { int p=to[i]; if(dis[p]>dis[dd]+cost[i]) { dis[p]=dis[dd]+cost[i]; if(!f[p]) { d[++tail]=p; f[p]=1; } } } }while(h<tail); } void spfa2(int s) { memset(dis2,127,sizeof(dis)); memset(f,0,sizeof(f)); dis2[s]=0; d[1]=s; f[s]=1; int h=0,tail=1; do { h++; int dd=d[h]; f[dd]=0; for(int i=head2[dd];i;i=net2[i]) { int p=to2[i]; if(dis2[p]>dis2[dd]+cost2[i]) { dis2[p]=dis2[dd]+cost[i]; if(!f[p]) { d[++tail]=p; f[p]=1; } } } }while(h<tail); } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add2(y,x,z); } spfa1(s); spfa2(s); for(int i=1;i<=n;i++) maxf1=max(dis[i]+dis2[i],maxf1); printf("%d",maxf1); return 0; }