zoukankan      html  css  js  c++  java
  • 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的做法。


  • 相关阅读:
    如果你正在找工作,也许这七个方法会帮到你
    WebSocket 浅析
    关系数据库涉及中的范式与反范式
    MySQL字段类型与合理的选择字段类型
    ER图,数据建模与数据字典
    详解慢查询
    MySQL的最佳索引攻略
    后端技术演进
    MySQL主从复制(BinaryLog)
    MySQL读写分离
  • 原文地址:https://www.cnblogs.com/pangblog/p/3304056.html
Copyright © 2011-2022 走看看