POJ 1062 昂贵的婚礼 ZJOI Dijkstra

题目简介:中文题,多读几遍题,清楚题意了就好做了。

题目分析:这道题考察对Dijkstra的熟练运用,本质还是求最短路。

    最核心的地方就是对哪些节点可以访问。我们可以进行枚举,设当前我们能够访问的最高等级maxl是lv[i],然后做标记进行Dijkstra,更新ans答案。

    

    if(lv[j]>maxl||maxl-lv[j]>m)//如果两者的等级差距 
v[j]=true;//做标记在Dijkstra中不再访问 
    else 
        v[j]=false;

如下代码(附带注释)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 1000000
using namespace std;
int n,m,lv[110],price[110][110],x[110],d[110];
//price[i][j] 表示在i点j的优惠品价格 
bool v[110];
int Dijkstra()
{
	for(int i=1;i<=n;i++)
		d[i]=price[0][i];//任何点的初始距离设为price[0][i],即为该物品的价格 
	for(int i=1;i<=n;i++)
	{
		int pos=0;
		int res=100000;
		for(int j=1;j<=n;j++)
		{
			if(!v[j]&&res>d[j])
			{
				pos=j;
				res=d[j];	
			}	
		}
		if(pos==0)
			break;
		v[pos]=true;
		for(int j=1;j<=n;j++)
		{
			if(!v[j]&&price[pos][j]>0/*pos点可达*/&&d[j]>d[pos]+price[pos][j])
				d[j]=d[pos]+price[pos][j];	
		}	
	}
	return d[1];	
}
int main()
{
	memset(d,0,sizeof(d));
	memset(lv,0,sizeof(lv));
	for(int i=1;i<=n;i++)
	d[i]=MAXN;
	memset(v,false,sizeof(v));
	int ans=0x7ffffff;
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>price[0][i]>>lv[i]>>x[i];
		for(int j=1;j<=x[i];j++)
		{
			int t,u;
			cin>>t>>u;
			price[t][i]=u;	
		}	
	}
	int maxl;
	int tem;
	for(int i=1;i<=n;i++)
	{
		maxl=lv[i];//设当前访问的最高等级是lv[i] 
		for(int j=1;j<=n;j++)
		{
			if(lv[j]>maxl||maxl-lv[j]>m)//如果两者的等级差距 
				v[j]=true;//做标记在Dijkstra中不再访问 
			else 
				v[j]=false;	
		}
		tem=Dijkstra();
		if(tem<ans)
			ans=tem;	
	}
	cout<<ans<<endl;
	while(1);
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值