zoukankan      html  css  js  c++  java
  • (最短路)Silver Cow Party --POJ--3268

    题目链接:

    http://poj.org/problem?id=3268

    题意:

    先求出所有牛到x的最短路,再求出x到所有牛的最短路,两者相加取最大值(单向图)(可以用迪杰斯特拉,SPFA)

    迪杰斯特拉:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    #include<vector>
    using namespace std;
    
    #define N 1005
    #define INF 0xfffffff
    
    int n, m, x;
    int a, b, t;
    int G[N][N], dist1[N], dist2[N];
    bool vis1[N], vis2[N];
    
    void IN()
    {
        memset(vis1, false, sizeof(vis1));
        memset(vis2, false, sizeof(vis2));
        for(int i=1; i<=n; i++)
        {
            dist1[i]=INF;
            dist2[i]=INF;
            for(int j=1; j<=i; j++)
                G[i][j]=G[j][i]=INF;
        }
    }
    
    void DIJ1()
    {
        dist1[x]=0;
        for(int i=1; i<=n; i++)
        {
            int index=1, MIN=INF;
            for(int j=1; j<=n; j++)
            {
                if(!vis1[j] && dist1[j]<MIN)
                {
                    index=j, MIN=dist1[j];
                }
            }
            vis1[index]=1;
            for(int j=1; j<=n; j++)
            {
              dist1[j]=min(dist1[j], dist1[index]+G[index][j]);
            }
        }
    }
    
    void DIJ2()
    {
        dist2[x]=0;
        for(int i=1; i<=n; i++)
        {
            int index=1, MIN=INF;
            for(int j=1; j<=n; j++)
            {
                if(!vis2[j] && dist2[j]<MIN)
                {
                    index=j, MIN=dist2[j];
                }
            }
            vis2[index]=1;
            for(int j=1; j<=n; j++)
            {
                dist2[j]=min(dist2[j], dist2[index]+G[j][index]);
            }
        }
    }
    
    
    int main()
    {
        while(scanf("%d%d%d", &n, &m, &x)!=EOF)
        {
            IN();
    
            for(int i=0; i<m; i++)
            {
                scanf("%d%d%d", &a, &b, &t);
                G[a][b]=t;
            }
    
            DIJ1();
            DIJ2();
    
            int ans=0;
            for(int i=1; i<=n; i++)
                ans=max(ans, dist1[i]+dist2[i]);
    
            printf("%d
    ", ans);
        }
        return 0;
    }
    勿忘初心
  • 相关阅读:
    MySql常用命令
    PHP截断函数mb_substr()
    explode() 字符串转换数组
    php取得当前时间函数
    Apache与Nginx的比较
    thinkphp5.0环境变量配置
    thinkphp5.0配置作用域
    thinkphp5.0动态配置
    Mac 下查看 Android Studio 的 SHA1的方法
    Mac 下 gradle 路径
  • 原文地址:https://www.cnblogs.com/YY56/p/4663369.html
Copyright © 2011-2022 走看看