POJ 1062 昂贵的聘礼(图论,最短路径)

Description

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。

为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

Output

输出最少需要的金币数。

Sample Input

1 4

10000 3 2

2 8000

3 5000

1000 2 1

4 200

3000 2 1

4 200

50 2 0

Sample Output

5250

Http

POJ:https://vjudge.net/problem/POJ-1062

Source

图论,动态规划

解决思路

首先是如何建图。

对于一个优惠如果用B来换A可以优惠到C元,我们连边B->A,边权为C。注意是有向边。那么我们在跑最短路的时候所有的初值都是其原价,最后跑出的到一的距离即为所求。

但由于本题有等级的限制,如果直接把限制条件加在最短路的松弛条件中会漏情况。解决方案是依次枚举每一个点,把其等级作为最高等级,然后把等级高于它或等级差大于M的点强制设置为已经经过,及Dijkstra里不再松弛,这样就可以了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std; const int maxN=101;
const int maxM=maxN*maxN;
const int inf=2147483647; int n,M;
class Graph//为了方便操作,封装在类里
{
private:
int cnt;
int Head[maxN];
int Next[maxM];
int V[maxM];
int W[maxM];
bool vis[maxN];
public:
int n;
int Dist[maxN];
int Value[maxN];//原价
int Status[maxN];//等级
void init()//初始化
{
cnt=0;
memset(Head,-1,sizeof(Head));
memset(Next,-1,sizeof(Next));
memset(Dist,127,sizeof(Dist));
}
void Add_Edge(int u,int v,int w)//加边
{
cnt++;
Next[cnt]=Head[u];
Head[u]=cnt;
V[cnt]=v;
W[cnt]=w;
}
int Dijkstra()//Dijkstra过程
{
for (int i=1;i<=n;i++)
Dist[i]=Value[i];
for (int i=1;i<n;i++)
{
int id=-1,mi=inf;
for (int j=1;j<=n;j++)
if ((vis[j]==0)&&(Dist[j]<mi))
{
mi=Dist[j];
id=j;
}
if (id==-1)
break;
vis[id]=1;
for (int i=Head[id];i!=-1;i=Next[i])
{
if ((vis[V[i]]==0)&&(Dist[V[i]]>Dist[id]+W[i]))
{
Dist[V[i]]=Dist[id]+W[i];
}
}
}
return Dist[1];
}
int work()//用work来调用Dijkstra,每次枚举最高等级,然后强制某些点不走
{
int Ans=inf;//记录最优答案
for (int i=1;i<=n;i++)
{
int maxlv=Status[i];
memset(vis,0,sizeof(vis));//注意每次先置0
for (int j=1;j<=n;j++)
if ((Status[j]>maxlv)||(maxlv-Status[j]>M))//大于当前最高等级或等级之差大于M的强制不松弛
vis[j]=1;
Ans=min(Ans,Dijkstra());//用当前图更新最佳的答案
}
return Ans;
}
}; Graph G; int main()
{
G.init();
cin>>M>>n;
G.n=n;
for (int i=1;i<=n;i++)
{
cin>>G.Value[i]>>G.Status[i];
int tot;
cin>>tot;
for (int j=1;j<=tot;j++)
{
int u,w;
cin>>u>>w;
G.Add_Edge(u,i,w);
}
}
cout<<G.work()<<endl;
return 0;
}

POJ 1062 昂贵的聘礼(图论,最短路径)的更多相关文章

  1. 最短路(Dijkstra) POJ 1062 昂贵的聘礼

    题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...

  2. poj 1062 昂贵的聘礼 (dijkstra最短路)

    题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  3. poj 1062 昂贵的聘礼 (最短路径)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33365   Accepted: 9500 Descriptio ...

  4. POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  5. 最短路POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  6. POJ 1062 昂贵的聘礼(带限制条件的dijkstra)

    题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  7. POJ 1062 昂贵的聘礼(最短路中等题)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 51879   Accepted: 15584 Descripti ...

  8. POJ -1062 昂贵的聘礼(前向星 &amp;&amp; SPFA)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/30299671 题目链接:id=1062&qu ...

  9. POJ 1062 昂贵的聘礼 (最短路)

    昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ...

随机推荐

  1. 2017-2018-2 20155224『网络对抗技术』Exp6:信息搜集与漏洞扫描

    实践内容 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点 漏洞扫描:会扫,会看报告,会查漏洞说明,会修补漏洞 基本问题回答 哪些 ...

  2. Redis发布订阅和事物笔记

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

  3. react脚手架改造(react/react-router/redux/eslint/karam/immutable/es6/webpack/Redux DevTools)

    公司突然组织需要重新搭建一个基于node的论坛系统,前端采用react,上网找了一些脚手架,或多或少不能满足自己的需求,最终在基于YeoMan的react脚手架generator-react-webp ...

  4. JQ_开发经验

    1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...

  5. ats反向代理和重定向

    作为反向代理缓存,ats代表源服务器提供的请求. ats的配置方式使客户端看起来像普通的原始服务器. 了解反向代理缓存通过转发代理缓存, ats代表请求内容的客户端队里对源服务器的web请求.反向代理 ...

  6. 《Deep Learning》(深度学习)中文版PDF免费下载

    <Deep Learning>(深度学习)中文版PDF免费下载 "深度学习"经典著作<Deep Learning>中文版pdf免费下载. <Deep ...

  7. DRF框架QQ登录功能

    用户模块---QQ登录 流程图 QQ登录文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0 流程简述 ...

  8. NumCPU()在slice中的使用

    package main import ( "fmt" "runtime" ) var slice []int func main() { array := m ...

  9. PHP 观察者模式和php实现 Observer Pattern

    观察者模式: 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅(Publ ...

  10. SE Springer小组《Spring音乐播放器》软件需求说明之四

    4 运行环境规定 4.1设备 我们计划完成的音乐软件较小巧,功能并不复杂,在普通笔记本电脑中即可运行,并无特殊硬设备要求. 4.2支持软件 需要用到windows操作系统,用VS编写C/C++代码,还 ...