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("\n");

            kcase++;

            scanf("%d%d",&be,&en);

            if(be==-1&&en==-1) break;

            printf("From %d to %d :\n",be,en);

            printf("Path: ");

            printf("%d",be);



            int temp=be;

            while(temp!=en)

            {

                printf("-->%d",path[temp][en]);

                temp=path[temp][en];

            }

            printf("\n");



            printf("Total cost : %d\n",dist[be][en]);



        }

     }

    return 0;

}


 


接下来是spfa的做法。


 

你可能感兴趣的:(HDU)