poj1062 Bellman 最短路应用
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 41066 | Accepted: 11959 |
Description
探险家拿不出这么多金币,便请求酋长减少要求。酋长说:"嗯,假设你能够替我弄到大祭司的皮袄。我能够仅仅要8000金币。假设你能够弄来他的水晶球,那么仅仅要5000金币即可了。
"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其它的东西。他能够减少价格。探险家于是又跑到其它地方。其它人也提出了类似的要求,或者直接用金币换。或者找到其它东西就能够减少价格。只是探险家不是必需用多样东西去换一样东西,由于不会得到更低的价格。
探险家如今非常须要你的帮忙。让他用最少的金币娶到自己的心上人。
另外他要告诉你的是。在这个部落里。等级观念十分森严。地位差距超过一定限制的两个人之间不会进行不论什么形式的直接接触。包含交易。
他是一个外来人,所以能够不受这些限制。
可是假设他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们觉得这样等于是间接接触。反过来也一样。因此你须要在考虑全部的情况以后给他提供一个最好的方案。
为了方便起见。我们把全部的物品从1開始进行编号,酋长的允诺也看作一个物品,而且编号总是1。
每一个物品都有相应的价格P。主人的地位等级L,以及一系列的替代品Ti和该替代品所相应的"优惠"Vi。假设两人地位等级差距超过了M。就不能"间接交易"。你必须依据这些数据来计算出探险家最少须要多少金币才干娶到酋长的女儿。
Input
每一个物品的描写叙述开头是三个非负整数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
Source
//这道是中文题,我居然还理解错了题意.本题的等级差是指 : 最高等级与最低等级的差值,并非每两个人之间的差值.
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define ll long long
#define inf 0x3f3f3f3f using namespace std;
int n,m;
struct node{
int p;
int l;
int x;
}a[110];
struct Nd{
int num;
int money;
}now;
int s,e;
vector<Nd>vec[110];
int vis[110];
int dis[110];
int ans;
void spfa(){
memset(vis,0,sizeof(vis));
memset(dis,inf,sizeof(dis));
queue<int>q;
q.push(1);
vis[1] = 1;
dis[1] = a[1].p;
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = 0;
for(int i = 0; i < vec[u].size(); ++i){
now = vec[u][i];
if(dis[now.num] > dis[u]-a[u].p+a[now.num].p+now.money&&a[now.num].l>=s && a[now.num].l<=e){
dis[now.num] = dis[u]-a[u].p+a[now.num].p+now.money;
if(!vis[now.num]){
vis[now.num] = 1;
q.push(now.num);
}
}
}
}
for(int i = 1; i <= n; ++i){
ans = min(ans,dis[i]);
}
}
int main()
{
while(~scanf("%d%d",&m,&n)){
for(int i = 0; i <= n; ++i){
vec[i].clear();
} for(int i = 1; i <= n; ++i){
scanf("%d%d%d",&a[i].p,&a[i].l,&a[i].x);
for(int j = 0; j < a[i].x; ++j){
scanf("%d%d",&now.num,&now.money);
vec[i].push_back(now);
}
} ans = inf;
for(int i = a[1].l-m; i <= a[1].l; ++i){
s = i;
e = i+m;
spfa();
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define INF 200000000 using namespace std; struct node
{
int u,v,w;
} edge[10000];
int num=0;
int N,M;
int P[2000],L[2000],n[2000];
int t,v;
int low[2000],a,b;
int has[2000] ;
int Bellman(int u0)
{
for(int i=0; i<=N; i++)
low[i]=INF; low[u0]=0;
for(int i=0; i<N-1; i++)
{
int flag=0;
for(int j=0; j<num; j++)
{
if(has[edge[j].u]&&has[edge[j].v]&&low[edge[j].u]+edge[j].w<low[edge[j].v])
{
low[edge[j].v]=low[edge[j].u]+edge[j].w;
flag=1;
}
}
if(flag==0)
break;
} int Min=INF;
for(int i=1; i<=N; i++)
{
low[i]+=P[i]; //最小价格为优惠价+拥有优惠价须要花多少钱
if(Min>low[i])
Min=low[i];
}
//printf("%d\n",Min);
return Min;
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&M,&N))
{
num=0;
for(int i=1; i<=N; i++)
{
scanf("%d%d%d",&P[i],&L[i],&n[i]);
for(int j=1; j<=n[i]; j++)
{
int a,b;
scanf("%d%d",&a,&b);
edge[num].u=i;
edge[num].v=a;
edge[num++].w=b; //存入优惠的价格
}
}
int ans=L[1];
int Min=INF;
//最高等级的与最低的等级差不会超过M
for(int i=0; i<=M; i++)
{
memset(has,0,sizeof(has));
for(int j=1; j<=N; j++)
{
if(ans-L[j]<=M-i&&L[j]-ans<=i)
{
has[j]=1;
}
}
int k=Bellman(1);
if(Min>k)
Min=k;
}
printf("%d\n",Min); }
}
poj1062 Bellman 最短路应用的更多相关文章
- hdu-1317 XYZZY---Floyd判连通+bellman最短路
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1317 题目大意: 题意:有n个房间(n<=100),每个房间有一个点权(第1号房间和第n号房间 ...
- poj 3259 bellman最短路推断有无负权回路
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36717 Accepted: 13438 Descr ...
- 昂贵的聘礼---poj1062(最短路)
题目链接:http://poj.org/problem?id=1062 题意很清楚: 可以虚拟一个起点0,由于存在等级关系,所以可以枚举等级,然后把各种关系建立边,然后计算0到1的距离即可,去最小值即 ...
- 最短路(bellman)-hdu1217
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的. 这时候,就需要使用其他的算法来求解最 ...
- poj题目
poj2965 poj1753:标准的BFS+位运算优化 poj1328:线段覆盖变种,把圆对应到线段上,贪心求解 poj2109:高精度开根,二分+高精度,注意要判断答案的位数,如果按照题目给的范围 ...
- 蓝桥杯 algo_5 最短路 (bellman,SPFA)
问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...
- 最短路(dijskra+SPFA+Bellman)
最短路 Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- 蓝桥杯 算法训练 最短路 [ 最短路 bellman ]
传送门 算法训练 最短路 时间限制:1.0s 内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证 ...
- [poj1062]昂贵的聘礼_最短路_离散化
昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...
随机推荐
- select选中值,传this
<select onChange = "a(this)"></select> function a(obj){ $(obj).find("opti ...
- 关于wdsl
WSDL元素 WSDL元素基于XML语法描述了与服务进行交互的基本元素: Type(消息类型):数据类型定义的容器,它使用某种类型系统(如XSD). Message(消息):通信数据的抽象类型化定义, ...
- (WC2016模拟十八)Gangsters of Treeland
HINT: $1\leq N,Q\leq 10^5$ 原题:CodeChef November Challenge 2013 - MONOPLOY 题解: 其实这题是[SDOI2017]树点涂色的弱化 ...
- POJ 3261 Milk Patterns(后缀数组+单调队列)
题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不 ...
- [SHOI2009]Booking 会场预约
题目:洛谷P2161. 题目大意:有一些操作,分为两种: A.增加一个从第l天到第r天的预约,并删除与这个预约冲突的其他预约,输出删除了多少个预约. B.输出当前有效预约个数. 两个预约冲突定义为两个 ...
- 改造vue-quill-editor: 结合element-ui上传图片到服务器
前排提示:现在可以直接使用封装好的插件vue-quill-editor-upload 需求概述 vue-quill-editor是我们再使用vue框架的时候常用的一个富文本编辑器,在进行富文本编辑的时 ...
- python 中i++、逻辑表达式
参考链接:https://www.cnblogs.com/yupeng/p/3345946.html i++运算符 python中没有类似i++之类实现+1的运算符,但是有++i,+-i.之类的,他们 ...
- Linux进程管理之状态(二)
二.进程的生命周期 进程是一个动态的实体,所以他是有生命的.从创建到消亡,是一个进程的整个生命周期.在这个周期中,进程可能会经历各种不同的状态.一般来说,所有进程都要经历以下的3个状态: 就绪态.指进 ...
- Camera Calibration 相机标定:原理简介(四)
4 基于3D标定物的标定方法 使用基于3D标定物进行相机标定,是一种传统且常见的相机标定法.3D标定物在不同应用场景下不尽相同,摄影测量学中,使用的3D标定物种类最为繁杂,如图-1的室内控制场,由多条 ...
- HDU——T 1507 Uncle Tom's Inherited Land*
http://acm.hdu.edu.cn/showproblem.php?pid=1507 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...