寻找从i到X,再从X到i的最短路
可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离
再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离
最后搜索dis1[i]+dis2[i]值最大的输出
#include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef pair<short,int> P; vector<P> graph1[1005],graph2[1005]; int N,M,X,dis1[1005],dis2[1005]; bool vis1[1005],vis2[1005]; queue<short> q; int main() { ios::sync_with_stdio(0);cin.tie(0); int i,j,d,cnt,len,ans=0; short a,b,id; cin>>N>>M>>X; for(i=0;i<M;i++) { cin>>a>>b>>d; graph1[a].push_back(P(b,d)); graph2[b].push_back(P(a,d)); } memset(dis1,INF,sizeof dis1); memset(dis2,INF,sizeof dis2); memset(vis1,false,sizeof vis1); memset(vis2,false,sizeof vis2); dis1[X]=dis2[X]=0; vis1[X]=vis2[X]=true; q.push(X); while(!q.empty()) { id=q.front(); q.pop(); cnt=graph1[id].size(); for(i=0;i<cnt;i++) { len=dis1[id]+graph1[id][i].second; if(!vis1[graph1[id][i].first]||len<dis1[graph1[id][i].first]) { dis1[graph1[id][i].first]=len; vis1[graph1[id][i].first]=true; q.push(graph1[id][i].first); } } } q.push(X); while(!q.empty()) { id=q.front(); q.pop(); cnt=graph2[id].size(); for(i=0;i<cnt;i++) { len=dis2[id]+graph2[id][i].second; if(!vis2[graph2[id][i].first]||len<dis2[graph2[id][i].first]) { dis2[graph2[id][i].first]=len; vis2[graph2[id][i].first]=true; q.push(graph2[id][i].first); } } } for(i=1;i<=N;i++) { if(i==X) continue; ans=max(ans,dis1[i]+dis2[i]); } cout<<ans; return 0; }