• 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;
    }
  • 相关阅读:
    Testlink1.9.17使用方法( 第三章 初始配置[配置用户、产品] )
    Testlink1.9.17使用方法(第二章 登录&汉化设置)
    Testlink1.9.17使用方法(第一章 前言)
    TestLink-Windows安装教程
    Linux-Redmine安装方法
    怎么使用Fiddler进行抓包
    配置ADB到Windows环境变量
    Android获取定位权限,获取设备所在的经纬度
    Paint.FontMetrics
    Bitmap上下合成图片
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12235257.html
Copyright © 2020-2023  润新知