您的位置:首页 > 其它

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

2013-01-03 17:23 344 查看
/*

题目大意:

给你一个无向图,求任意两点的最短路。附加条件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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: