zoukankan      html  css  js  c++  java
  • 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]);
            }
        }
    }
    


  • 相关阅读:
    poj-1273(最大流)
    SPOJ
    Gym
    (转)博弈 SG函数
    《STL详解》解题报告
    《STL详解》读书笔记
    LightOJ
    hdu1286 找新朋友 欧拉函数模板
    (转)数位dp
    (转)约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7341105.html
Copyright © 2011-2022 走看看