zoukankan      html  css  js  c++  java
  • 【floyd存字典序路径】【HDU1385】【Minimum Transport Cost】

    题目大意 求多组i到j的最短路径 并输出字典序最小....



    现在只会floyd的方式

    利用dis[i][j] 表示i到j的路径中i 后面的节点


    更新是比较dis[i][j] dis[i][k].

    记住这个就好 ,其余存法貌似会有问题。代码如下:

    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <string>
    #define oo 0x13131313
    using namespace std;
    const int maxn=50+5;
    int N;
    int MAP[maxn][maxn];
    int dis[maxn][maxn];
    int w[maxn];
    void input()
    {
       for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
                dis[i][j]=1000000000;
        memset(MAP,0,sizeof(MAP));
        memset(w,0,sizeof(w));
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
        {
                int c;
                scanf("%d",&c);
                if(c==-1)
                {
                    MAP[i][j]=1000000000;
                }
                else MAP[i][j]=c;
        }
        for(int i=1;i<=N;i++)
       {
           scanf("%d",&w[i]);
       }
    }
    int FIND(int a,int b)
    {
        if(dis[a][b]!=1000000000)
        {
           return FIND(a,dis[a][b]);
        }
        else return b;
    }
    void floyd()
    {
        for(int i=1; i<=N; i++)
            for(int j=1; j<=N; j++)
                dis[i][j] = j;
    
        for(int k=1;k<=N;k++)
        {
            for(int i=1;i<=N;i++)
                for(int j=1;j<=N;j++)
            {
                int new_patl = MAP[i][k] + MAP[k][j] + w[k];
                if(MAP[i][j]>new_patl)
                {
                    MAP[i][j]=new_patl;
                    dis[i][j]=dis[i][k];
                }
                else  if(MAP[i][j]==new_patl)
                {
                    dis[i][j]=min(dis[i][j],dis[i][k]);
                }
            }
        }
    }
    void solve()
    {
        int CASE=0;
        int n,m;
        int next;
        while(cin>>n>>m&&(n!=-1&&m!=-1))
        {
            printf("From %d to %d :
    ",n,m);
            printf("Path: ");
            next = n;
            while(next != m)
    			{
    				printf("%d-->", next);
    				next = dis[next][m];
    			}
            printf("%d
    ", next);
            printf("Total cost : %d
    ",MAP[n][m]);
            printf("
    ");
        }
    }
    void init()
    {
        freopen("a.in","r",stdin);
        freopen("a.out","w",stdout);
    }
    int main()
    {
       // init();
    	while(cin>>N&&N)
        {
            input();
            floyd();
            solve();
        }
    }
    


  • 相关阅读:
    【分享】管理的最高境界是简单
    建立市场化风险评估机制推进地方政府信用评级建设
    手游-神雕侠侣 85侠客纪攻略(已通关)
    使用git的分支功能实现定制功能摘取与组合的想法
    组内正则培训记录
    组内Linq培训记录
    一次代码重构记录
    git代码库误操作还原记录
    关于代码重构的开始
    如何管理高手、大牛?
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480360.html
Copyright © 2011-2022 走看看