您的位置:首页 > 其它

HDU 3631(Shortest Path) 最短路问题 (Floyd)

2014-11-13 10:55 429 查看
最短路问题,0 x 操作 如果加入的是未标记的点,利用Floyd 求经过该点的最短路,1 x y 操作就可以读取通过标记点的最短路。

复杂度O(n3),因为Q有点大,如果按一般方法用SPFA或者Dijkstra,估计基本超时,本人较笨,试了下均超时,所以只能用Floyd,O(n3)+O(Q-n)。

Floyd:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define INF 0x3f3f3f3f
#define MAX_VEREXT 310

int mark[MAX_VEREXT],map[MAX_VEREXT][MAX_VEREXT];
int vex,arc;

void Floyd(int s)
{
int i,j;
for(i=0;i<vex;i++)
{
for(j=0;j<vex;j++)
{
if(map[i][j]>map[i][s]+map[s][j])  map[i][j]=map[i][s]+map[s][j];
}
}
}
int main()
{
int i,j,Q,count;
int a,b,c;
int aa,bb,cc;
count=1;
while(scanf("%d%d%d",&vex,&arc,&Q)!=EOF)
{
if(vex==0 && arc==0 && Q==0) break;
memset(mark,0,sizeof(mark));
for(i=0;i<MAX_VEREXT;i++)
{
for(j=0;j<MAX_VEREXT;j++)
if(i==j) map[i][j]=0;
else map[i][j]=INF;
}
for(i=0;i<arc;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c) map[a][b]=c;
}
if(count>1) printf("\n");
printf("Case %d:\n",count++);
for(i=0;i<Q;i++)
{
scanf("%d",&aa);
if(aa==0)
{
scanf("%d",&bb);
if(mark[bb]==0)
{
mark[bb]=1;
Floyd(bb);
}
else printf("ERROR! At point %d\n",bb);
}
else
{
scanf("%d%d",&bb,&cc);
if(mark[bb]==0 || mark[cc]==0) printf("ERROR! At path %d to %d\n",bb,cc);
else
{
if(map[bb][cc]<INF) printf("%d\n",map[bb][cc]);
else printf("No such path\n");
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: