ZJNU 1367

寻找从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;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12235257.html