POJ 1062 昂贵的聘礼 Dijkstra

本文介绍了一种通过枚举交换范围并结合最短路径算法来解决婚姻买卖问题的方法。问题实质是在特定条件下寻找最优交易路径,确保在交易过程中获得最大的优惠。

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

 

 好不容易看到大段的中文啊..这不是爱情买卖..是婚姻买卖啊...

一开始困惑怎么解决等级交换问题,后来看了大牛的思路,才知道原来是枚举交换范围加求最短路啊..果然巧妙.

假设酋长的等级是N,等级交换差距限制是M,那么探险家只能和N-M到N+M等级范围内的人交换物品

但是并不代表探险家能在这个范围内自由交换,比如说,你和N-M等级的人交换了,N+M等级的人就不会和你换了..

但是可以保证的是(N-M,N),(N-M+1.N+1)......(N,N+M)这些分范围内的人都是能自由交换的,彼此最大等级差是M..

因此只要枚举这些区间,求最短路,路径中的点必须符合等级范围即可.

之所以是求最短路,是因为在换的过程中尽量优惠,将优惠后价格加起来,看到每一点优惠后的价格最低是多少就可以了,注意最后一件物品是要购买的,因此要将所有点的值加上该点对应商品的价值求最小值.

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#define INF 1e8
using namespace std;
typedef pair<int,int> pa;
struct point{
	int v;//价值
	int l;//等级 
}p[105];//点 
int map[105][105];//边
int value[105];
int done[105];
int m,n; 
void init(){//初始化邻接矩阵
	for(int i=0;i<105;i++){
		for(int j=0;j<105;j++){
			map[i][j]=(i==j)?0:INF;
		}
	}	
}
int dij(int level){
	for(int i=1;i<=n;i++){
		value[i]=(i==1)?0:INF;
	}
	memset(done,0,sizeof done);
	priority_queue<pa,vector<pa>,greater<pa> > q;//使用优先队列实现Dijkstra
	q.push(make_pair(value[1],1));
	while(!q.empty()){
		int x=q.top().second;
		q.pop();
		if(done[x])continue;
		done[x]=1;
		for(int i=1;i<=n;i++){
			if(map[x][i]!=0&&p[i].l>=level&&p[i].l<=level+m&&value[i]>value[x]+map[x][i]){
				value[i]=value[x]+map[x][i];
				q.push(make_pair(value[i],i));
			}
		}
	}
	int m=INF;
	for(int i=1;i<=n;i++){//还要加上买该物品的值
		value[i]+=p[i].v;
		//printf("  %d\n",value[i]);
		m=min(m,value[i]);
	}
	return m;
}
int main(){
	//freopen("in.txt","r",stdin);
	scanf("%d%d",&m,&n);
	int ed,te,tv;
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&p[i].v,&p[i].l,&ed);
		for(int j=0;j<ed;j++){
			scanf("%d%d",&te,&tv);
			map[i][te]=tv;
		}
	}
	int res=INF;
	for(int i=p[1].l-m;i<=p[1].l;i++){//枚举可能的范围,分别求最小值
		res=min(res,dij(i));
	}
	printf("%d\n",res);
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值