zoukankan      html  css  js  c++  java
  • UESTC 914 方老师的分身I Dijkstra

    题意:求有向图的往返最短路的最长长度。

    分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来。考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果。

    所以此题为求两次最短路。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define Mod 1000000007
    using namespace std;
    #define N 1007
    
    int mp[N][N],n,m;
    int dis[N],vis[N],dis2[N];
    
    void Dijastra(int s,int *dis)
    {
        int now = s;
        int i,k;
        dis[now] = 0;
        vis[now] = 1;
        for(i=1;i<=n;i++)
        {
            for(k=1;k<=n;k++)  //order 1
            {
                if(mp[now][k] != Mod && dis[now] + mp[now][k] < dis[k])
                    dis[k] = dis[now] + mp[now][k];
            }
            int mini = Mod;   //order 2
            for(k=1;k<=n;k++)
            {
                if(dis[k] < mini && !vis[k])
                {
                    now = k;
                    mini = dis[k];
                }
            }
            vis[now] = 1;
        }
    }
    
    int main()
    {
        int u,v,w,i,j,x;
        while(scanf("%d%d%d",&n,&m,&x)!=EOF)
        {
            for(i=1;i<=n;i++)
                dis[i] = Mod;
            dis[x] = 0;
            for(i=1;i<=n;i++)
            {
                for(j=i;j<=n;j++)
                    mp[i][j] = mp[j][i] = Mod;
                mp[i][i] = 0;
            }
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&w);
                mp[u][v] = w;
            }
            memset(vis,0,sizeof(vis));
            Dijastra(x,dis);
            for(i=1;i<=n;i++)
                dis2[i] = Mod;
            dis2[x] = 0;
            for(i=1;i<=n;i++)
            {
                for(j=i+1;j<=n;j++)
                {
                    swap(mp[i][j],mp[j][i]);
                }
            }
            memset(vis,0,sizeof(vis));
            Dijastra(x,dis2);
            int maxi = -1;
            for(i=1;i<=n;i++)
            {
                if(dis[i] < Mod && dis2[i] < Mod)
                    maxi = max(maxi,dis[i]+dis2[i]);
            }
            printf("%d
    ",maxi);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    【力扣】461. 汉明距离
    【力扣】206. 反转链表
    【力扣】169. 多数元素
    LINQ 基本子句之三 let
    LINQ 基本子句之二 join
    LINQ 基本子句之一 (select/where/group/into)
    关于Console的Main(String[] args)参数输入
    SQL Common Sense 碎片一
    简单组合条件查询
    关于SQL 系统自带存储过程的使用 (一)
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3765417.html
Copyright © 2011-2022 走看看