现在的位置: 首页 > 综合 > 正文

HDU 1595——find the longest of the shortest

2013年03月07日 ⁄ 综合 ⁄ 共 1354字 ⁄ 字号 评论关闭

dijcstra算法

做法是在这个无向图中,先求出起点到终点的最短路径,并且标记出起点到终点所经过的节点,然后在采用枚举法,把其中的道路改变。求出其中的最大值即可。
代码写的很难看,懒得改了。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define INF 100001
int map[1003][1003],dis[1003],be[1003];//be[i]代表i点的前一个点
bool que[1003];
int main()
{
	int n,m,min,k,i,j;
	int s,e,t;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(que,0,sizeof(que));
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				map[i][j]=INF;
		for(i=1;i<=m;i++)
		{
			scanf("%d%d%d",&s,&e,&t);
			if(map[s][e]>t)
				map[s][e]=map[e][s]=t;
		}
		for(i=1;i<=n;i++)
		{
			dis[i]=map[1][i];
			be[i]=1;
		}
		que[1]=1;
		dis[1]=0;
		for(i=2;i<=n;i++)
		{
			min=INF;
			for(j=1;j<=n;j++)
				if(!que[j]&&dis[j]<min)
				{
					min=dis[j];
					k=j;
				}
			que[k]=1;
			if(min==INF||que[n])
			{
				break;
			}
			for(j=1;j<=n;j++)
				if(!que[j]&&dis[j]>map[k][j]+dis[k])
				{
					dis[j]=map[k][j]+dis[k];
					be[j]=k;
				}
		}
		if(dis[n]==INF)
		{
			printf("-1\n");
		}
		else
		{
			////////////////////////////////////////////////////////////////
			int num,S,E,T;
			int max;
			max=dis[n];
			num=n;
			while(num!=1)
			{
				S=num;
				E=be[num];
				T=map[num][be[num]];
				map[S][E]=map[E][S]=INF;
				memset(que,0,sizeof(que));
				for(i=1;i<=n;i++)
					dis[i]=map[1][i];
				que[1]=1;
				dis[1]=0;
				for(i=2;i<=n;i++)
				{
					min=INF;
					for(j=1;j<=n;j++)
						if(!que[j]&&dis[j]<min)
						{
							min=dis[j];
							k=j;
						}
						que[k]=1;
						if(min==INF||que[n])
						{
							break;
						}
						for(j=1;j<=n;j++)
							if(!que[j]&&dis[j]>map[k][j]+dis[k])
								dis[j]=map[k][j]+dis[k];			
				}
				if(max<dis[n])
					max=dis[n];
				map[S][E]=map[E][S]=T;
				num=be[num];
			}
			if(dis[n]==INF)
			{
				printf("-1\n");
			}
			else
				printf("%d\n",max);
		}
	}
	return 0;
}

抱歉!评论已关闭.