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的做法。


 

posted @ 2013-09-05 19:02  pangbangb  阅读(326)  评论(0编辑  收藏  举报