• HDU 1385 Minimum Transport Cost


    最短路问题。


    题意是说 给你一个矩阵,是各点到各点所需费用。

    然后给你N个数,是每一个点所需过路费。

    然后输出 询问 a,b 之间所需最小费用,还有路径。


    假设不是路径 必须输出 最小字典序,这题非常easy,必须输出最小字典序就非常恶心了。SPFA写

    会非常麻烦。

    然后我就Floyd的。

    把路径也一起更新就好了。


    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<map>
    #include<stack>
    #include<iostream>
    #include<list>
    #include<set>
    #include<cmath>
    #define INF 0x7fffffff
    #define eps 1e-6
    #define LL long long
    using namespace std;
    int n,m;
    int g[101][101];
    int cost[101];
    int path[101][101];
    
    void Floyd()
    {
        for(int k=1; k<=n; k++)
        {
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    if(g[i][k]==INF||g[k][j]==INF)continue;
                    int len=g[i][k]+g[k][j]+cost[k];
                    if(g[i][j]>len)
                    {
                        g[i][j]=len;
                        path[i][j]=path[i][k];
                    }
                    else if(g[i][j]==len)
                    {
                        path[i][j]=min(path[i][j],path[i][k]);
                    }
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d",&n),n)
        {
            int tmp;
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                {
                    scanf("%d",&tmp);
                    if(tmp==-1)
                        g[i][j]=INF;
                    else
                        g[i][j]=tmp;
                    path[i][j]=j;
                }
    
            for(int i=1; i<=n; i++)
                scanf("%d",&cost[i]);
    
            Floyd();
            int i,j;
    
            while(scanf("%d%d",&i,&j),i!=-1||j!=-1)
            {
                printf("From %d to %d :
    ", i, j);
                printf("Path: %d", i);
                int k = i;
                while(k != j)
                {
                    printf("-->%d", path[k][j]);
                    k = path[k][j];
                }
                printf("
    ");
                printf("Total cost : %d
    
    ", g[i][j]);
            }
        }
    }
    


  • 相关阅读:
    javascript 写一个随机范围整数的思路
    Promise中的next 另一个用法
    继上一篇随笔,优化3张以上图片轮播React组件
    低性能3张图片轮播React组件
    用函数式编程思维解析anagrams函数
    Python time time()方法
    torch.view().expand()
    pytorch中的top_K()函数
    设定学习率衰减
    两个集合求交集
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7341105.html
Copyright © 2020-2023  润新知