hdu 1385 floyd+最小字典序路径输出!!

/*
题目大意:

给你一个无向图,求任意两点的最短路。附加条件2个:

1.经过每个节点必须缴纳一点的税。

2.如果有多条最短路径,寻找字典序最小的路径。

PS:我一开始用dijstra 写了半天,WA了半天,也没搞出来个什么东东!!老是WA。。。。。。。

     后来迫不得已,改成floyd了。。。。。。。。
有种吐血的冲动~~~~

*/


#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN=1202;
const int INF=99999999;
int map[MAXN][MAXN],path[MAXN][MAXN],n,cost[MAXN],st,ed;
void Floyd()
{
    int i,j,k;
    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
            {
                if(map[i][j]>map[i][k]+map[k][j]+cost[k])
                {
                    map[i][j]=map[i][k]+map[k][j]+cost[k];
                    path[i][j]=path[i][k];
                }
                else if(map[i][j]==map[i][k]+map[k][j]+cost[k])//寻找字典序更小的路径
                {
                    if(path[i][j]>path[i][k])
                    {
                        path[i][j]=path[i][k];
                    }
                }
            }
}
int main()
{
    while(scanf("%d",&n)!=EOF&&n)
    {
        int i,j,w;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                path[i][j]=j;
                scanf("%d",&map[i][j]);
                if(map[i][j]==-1) map[i][j]=INF;
            }
        }
        for(i=1; i<=n; i++)
            scanf("%d",&cost[i]);
        Floyd();
        while(scanf("%d%d",&st,&ed))
        {
            if( st==-1&&ed==-1) break;
            printf("From %d to %d :\n",st,ed);
            printf("Path: %d",st);
            int u=st,v=ed;
            while (u!=v)
            {
                printf ("-->%d", path[u][v]);
                u=path[u][v];
            }
            printf("\n");
            printf("Total cost : %d\n\n",map[st][ed]);
        }
    }
    return 0;
}


你可能感兴趣的:(hdu 1385 floyd+最小字典序路径输出!!)