hdu2962

本文介绍了一种结合二分查找与SPFA算法解决特定路径寻找问题的方法。该算法适用于大规模图数据处理,尤其当节点数量达到1000级别时表现出良好的效率。通过对指定高度限制下的最短路径进行搜索,实现对最大可行高度及对应路径长度的有效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
分析:
    真稀罕,卓提类系间敢对到10s,真不赖啊~
    二分+SPFA,因为有1000与哦点,所以俺系用的SPFA,
至于为啥用二分,就不俺接住所了吧~


    156MS,1a~


                                            2012-07-26
*/








#include"stdio.h"
#include"string.h"


struct A
{
	int dis;
	int total;
	int mem[111];
	int len[111];
	int high[111];
}E[1011];
int s,e;


int SPFA(int limit)
{
	int queue[2222];
	int k,key;
	int hash[1011];
	int i;


	memset(hash,0,sizeof(hash));
	k=0;
	key=1;
	queue[0]=s;
	hash[s]=1;


	while(k<key)
	{
		for(i=0;i<E[queue[k]].total;i++)
		{
			if(E[queue[k]].high[i]<limit && E[queue[k]].high[i]!=-1)	continue;
			if(E[queue[k]].dis+E[queue[k]].len[i]<E[E[queue[k]].mem[i]].dis)
			{
				E[E[queue[k]].mem[i]].dis=E[queue[k]].dis+E[queue[k]].len[i];
				if(!hash[E[queue[k]].mem[i]])
				{
					hash[E[queue[k]].mem[i]]=1;
					queue[key++]=E[queue[k]].mem[i];
				}
			}
		}
		hash[queue[k++]]=0;
	}
	return E[e].dis;
}
int main()
{
	int Case=1;
	int n,r;
	int i;
	int a,b,c,d;
	int low,high,mid;
	int Limit;
	int temp,ans_high,ans_len;


	while(scanf("%d%d",&n,&r),n||r)
	{
		if(Case>1)	printf("\n");

		for(i=1;i<=n;i++)	E[i].total=0;
		for(i=0;i<r;i++)
		{
			scanf("%d%d%d%d",&a,&b,&c,&d);
			E[a].mem[E[a].total]=b;
			E[a].high[E[a].total]=c;
			E[a].len[E[a].total++]=d;


			E[b].mem[E[b].total]=a;
			E[b].high[E[b].total]=c;
			E[b].len[E[b].total++]=d;
		}


		scanf("%d%d%d",&s,&e,&Limit);


		low=0;
		high=Limit;
		mid=(low+high)>>1;
		ans_high=-1;
		while(low<=high)
		{
			for(i=1;i<=n;i++)	E[i].dis=11111111;
			E[s].dis=0;


			temp=SPFA(mid);
			if(temp!=11111111)
			{
				if(mid>ans_high)	{ans_high=mid;ans_len=temp;}
				low=mid+1;
			}
			else	high=mid-1;
			mid=(low+high)>>1;
		}


		printf("Case %d:\n",Case++);
		if(ans_high==-1)	printf("cannot reach destination\n");
		else
		{
			printf("maximum height = %d\n",ans_high);
			printf("length of shortest route = %d\n",ans_len);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值