zoukankan      html  css  js  c++  java
  • hdu 1385 题意 测试数据 果枫

    题意:两点间的最短距离,并输出路径(按字典序排列),如何理解字典序,如:1>4>5>6的值等于1>2>5>6的值而且都为最短路径,

    此时必须输出:1>2>5>6

    解法:floyd

    ac代码:

    View Code
    #include<iostream>
    using namespace std;
    
    const int INT=0x7fffff;
    const int M=1000+99;
    int map[M][M];//存地图
    int d[M];//存每一个点的税金
    int path[M][M];//记录点i->j经过的点
    int n;
    
    
    
    void floyd()
    {
        int i,j,k;
    
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                path[i][j]=j;
    
        for(k=1;k<=n;k++)
        {
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                {
                    if(map[i][k]+map[k][j]+d[k]<map[i][j])//松弛操作
                    {
                        map[i][j]=map[i][k]+map[k][j]+d[k];
                        path[i][j]=path[i][k];
                    }
                    else
                        if(map[i][k]+map[k][j]+d[k]==map[i][j])//按字典排序的关键
                        {
                            if(path[i][j]>path[i][k])
                                path[i][j]=path[i][k];
                        }
                }
            }
        }
    }
    
    
    
    int main()
    {
        while(cin>>n,n)
        {
            memset(map,0,sizeof(map));
            memset(d,0,sizeof(d));
    
            int i,j;
            int a,b;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                {
                    cin>>a;
                    if(a!=-1)
                        map[i][j]=a;
                    else
                        map[i][j]=INT;
                }
            }
    
            for(i=1;i<=n;i++)
                cin>>d[i];
    
            floyd();//调用floyd函数
    
            while(cin>>a>>b,!(a==-1&&b==-1))
            {
                printf("From %d to %d :\nPath: ",a,b);
    
                if(a==b) //当自己访问自己时经过的点只需输出自己
                    cout<<a<<endl;
                else
                {
                    int x=a,y=b;
                    int c=x;
                    cout<<a<<"-->";
                    while(path[x][y]!=y)//输出经过的每一个点
                    {
                        cout<<path[x][y]<<"-->";
                        x=path[x][y];
                    }
                    cout<<b<<endl;
                }
                printf("Total cost : %d\n",map[a][b]);//此时的任意一个map[][]都存储了,任意点i->j的最短路径
                cout<<endl;
            }
        }
        return 0;
    }
    
    /*
    5
    0 3 22 -1 4
    3 0 5 -1 -1
    22 5 0 9 20
    -1 -1 9 0 4
    4 -1 20 4 0
    5 17 8 3 1
    1 3
    3 5
    2 4
    1 1
    -1 -1
    
    */

        
     

  • 相关阅读:
    组内分享总结
    Java虚拟机内存
    代理 正向代理 反向代理
    Class文件打包成jar并执行
    Oracle 并集交集差集
    Sysstat安装以及简单操作
    树结构列表结构相互转换 js
    nginx配置root和alias的区别
    js call apply 用法
    VS Code配置同步
  • 原文地址:https://www.cnblogs.com/zgfailmr/p/2670971.html
Copyright © 2011-2022 走看看