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();
        }
    }
    


  • 相关阅读:
    详解Winform多线程编程基本原理
    asp.net 文件夹和文件的创建、删除
    sql server 查询表名,存储过程,列名等
    随机输出数组中的一个数
    C# 获取Access数据库中所有表名及其列名、列类型
    Oracle 数据库小记
    Oracle11g、PLSQL、Winfrom环境搭建
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    Android开发中用到的框架、库介绍
    Android数据存储
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480360.html
Copyright © 2011-2022 走看看