• 来回最短路POJ3268


    这个题得主要考点在于给你的图是去了再回来得有向图,如何模块化解决呢就是转变图的方向,我们根据初始得放心求出每个点到x得最短路,然后转变所有路得方向再求出所有点到x得最短路,最后一相加就是最后的来回了~~
    实现得时候我用到了数组指针,感觉非常得方便

    #include <iostream>
    #include <string.h>
    #include <cstdio>
    #define inf 0x3f3f3f3f
    using namespace std;
    const int maxn = 1010;
    int mp[maxn][maxn];
    int remp[maxn][maxn];
    int dis[maxn];
    int redis[maxn];
    int vis[maxn];
    int n,m,x;
    void init(int n)
    {
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j <= n;j++)
            {
                if(i == j)
                {
                    mp[i][j] = 0;
                    remp[i][j] = 0;
                }
                else
                {
                    mp[i][j] = inf;
                    remp[i][j] = inf;
                }
            }
        }
    }
    void Dijkstra(int s,int (*p)[1010],int *d)
    {
        for(int i = 1;i <= n;i++)
        {
            d[i] = p[s][i];
            vis[i] = 0;
        }
        vis[s] = 1;
        for(int i = 1;i <= n;i++)
        {
            int minlen = inf,net = 0;
            for(int j = 1;j <= n;j++)
            {
                if(!vis[j] && d[j] < minlen)
                {
                    minlen = d[j];
                    net = j;
                }
            }
            if(net == 0)break;
            vis[net] = 1;
            for(int j = 1;j <= n;j++)
            {
                if(!vis[j])
                {
                    d[j] = min(d[j],d[net] + p[net][j]);
                }
            }
        }
    }
    int main()
    {
        while(~scanf("%d%d%d",&n,&m,&x))
        {
            init(n);
            int a,b,l;
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&l);
                if(mp[a][b] > l)
                {
                    mp[a][b] = l;
                    remp[b][a] = l;
                }
            }
            Dijkstra(x,mp,dis);
            Dijkstra(x,remp,redis);
            int ans = 0;
            for(int i = 1;i <= n;i++)
            {
                ans = max(ans,dis[i] + redis[i]);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    modal
    NSSpeechSynthesizer 文字变语音
    AVFoundation 初识
    语系/地区码
    Mac 平台下安装 OpenVC
    19-iOS图形性能
    01-产品发布10个大坑
    18-NSString之Strong和copy
    17-xcode6插件开发入门
    16-不能错过的Xcode插件
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/8515676.html
Copyright © 2020-2023  润新知