poj 1062 昂贵的聘礼【条件约束----最短路】

这个题寒假的时候就遇见了--一直不会写--


题目链接:1062


汉语题--题意就不说了---

就相当于从0点到1点的最短距离---

从0点到(1-n)点的距离都有--

1-n点之间有一些路(单向路)

有一个约束条件M

即在最短路上最大的等级与最小的等级之差小于等于M---

点就100个

我们枚举枚举一个最大等级--求出在每一个最大等级所满足的条件下的最短路--

时间复杂度O(N^3)


代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int deep[120];
int map[120][120];
int dis[120];
bool fafe[120],val[120];
void init()
{
	for (int i=0;i<=n;i++)
	for (int j=0;j<=n;j++)
	map[i][j]=1111111111;
}
int disk()
{
	memset(fafe,true,sizeof(fafe));
	for (int i=1;i<=n;i++)
	if (val[i]) dis[i]=map[0][i];
	else dis[i]=1111111111;
	while (1)
	{
		int mi=1111111112,ii;
		for (int i=1;i<=n;i++)
		if (fafe[i]&&mi>dis[i])
			mi=dis[i],ii=i;
		if (ii==1) return mi;
		fafe[ii]=false;
		if (val[ii])
		for (int i=1;i<=n;i++)
		if (val[i]&&fafe[i]&&dis[i]>map[ii][i]+dis[ii])
		dis[i]=map[ii][i]+dis[ii];
	}
}
int main()
{
	int a,b,k;
	scanf("%d%d",&m,&n);
	init();
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&a,&deep[i],&k);
		map[0][i]=a;
		while (k--)
		{
			scanf("%d%d",&a,&b);
			map[a][i]=b;
		}
	}
	int ans=1111111111;
	for (int i=1;i<=n;i++)
	{
		int ma=deep[i];
		for (int j=1;j<=n;j++)
		{
			if (deep[j]>ma||ma-deep[j]>m)
			val[j]=false;
			else
			val[j]=true;
		}
		int ss=disk();
		ans=min(ss,ans);
	}
	printf("%d\n",ans);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值