• HDU1385 【输出字典序最小的最短路】


    这题经过的结点比较好处理。

    主要是字典序的处理。

    先是floyd做法,采用记录后驱的方法。  path[i][j]=j【初始化。。。】

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstring>
    using namespace std;
    
    const int maxn=5000;
    const int INF=100000000;
    
    int n;
    int node[maxn];
    int dist[maxn][maxn];
    int path[maxn][maxn];
    
    void floyd()
    {
        for(int i=1;i<=n;i++)//初始化 有一种后驱的感觉
            for(int j=1;j<=n;j++)
                path[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 temp=dist[i][k]+dist[k][j]+node[k];
                    if(dist[i][j]>temp)
                    {
                        dist[i][j]=temp;
                        path[i][j]=path[i][k];
                    }
                    if(dist[i][j]==temp)
                    {
                        if(path[i][j]>path[i][k])
                            path[i][j]=path[i][k];
                    }
                }
    }
    
    int main()
    {
        int a,be,en;
        while(scanf("%d",&n)&&n)
        {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    scanf("%d",&a);
                    if(a!=-1) dist[i][j]=a;
                    else dist[i][j]=INF;
                }
            for(int i=1;i<=n;i++) scanf("%d",&node[i]);
    
            floyd();
    
            int kcase=0;
            while(1)
            {
                if(kcase!=0) printf("
    ");
                kcase++;
                scanf("%d%d",&be,&en);
                if(be==-1&&en==-1) break;
                printf("From %d to %d :
    ",be,en);
                printf("Path: ");
                printf("%d",be);
    
                int temp=be;
                while(temp!=en)
                {
                    printf("-->%d",path[temp][en]);
                    temp=path[temp][en];
                }
                printf("
    ");
    
                printf("Total cost : %d
    ",dist[be][en]);
    
            }
         }
        return 0;
    }
    



    接下来是spfa的做法。


  • 相关阅读:
    爱的感悟
    连点成图:享受创建图形的乐趣
    python实现动态更新远程机器列表的SSH登录脚本
    python生成数据库中所有表的DESC描述
    生活之美
    克服“测试怠惰”的习惯
    使用git和github托管个人项目
    连点成线
    一次合并数据库的经历
    python使用装饰器捕获异常
  • 原文地址:https://www.cnblogs.com/pangblog/p/3304056.html
Copyright © 2020-2023  润新知