昂贵的聘礼
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 41066   Accepted: 11959

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

Source

//这道是中文题,我居然还理解错了题意.本题的等级差是指  : 最高等级与最低等级的差值,并非每两个人之间的差值.

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define ll long long
#define inf 0x3f3f3f3fusing 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 200000000using 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;//最高等级的与最低的等级差不会超过Mfor(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);        }
}

转载于:https://www.cnblogs.com/jzssuanfa/p/7061618.html

poj1062 Bellman 最短路应用相关推荐

  1. 简单算法-bellman最短路

    一.什么是bellman-ford算法?        上篇讲到了Floyd算法,它是多源最短路径算法.这里讲的bellman 则是单源最短路径算法.该算法优化了Floyd那样广撒网的形式,一定程度上 ...

  2. SPFA or bellman ford松弛法--单源最短路

    问题概述:有编号1-n的n个站点,有m条公交车路线,公交车只从一个起点站直接到达终点站,是单向的且每条路线有它自己的车费,有P个人早上从1出发,他们要到达每一个公交站点,然后到了晚上再返回点1,求所有 ...

  3. 算法小讲堂之最短路算法(Floyd+bellman+SPFA+Dijkstra)

    前言 如果你对图论相关知识一点也没有,那么建议您先去了解这些知识:https://acmer.blog.csdn.net/article/details/122310835,然后就可以快乐的学习最短路 ...

  4. 杭电 2544 最短路(bellman详解)

    首先介绍一下bellman算法: Bellman-ford算法是求含负权图的单源最短路径算法,效率很低,但代码很容易写.即进行持续地松弛(原文是这么写的,为什么要叫松弛,争议很大),每次松弛把每条边都 ...

  5. AcWing 853. 有边数限制的最短路(bellman的k边限制最短路)

    题目链接 https://www.acwing.com/problem/content/855/ 思路 思路其实利用了bellman_ford算法的特点,之前还没注意过,我们在第一层循环限制每个点可以 ...

  6. 0x61.图论 - 最短路

    目录 单源最短路径 一.Dijkstra算法 1.常用的优先队列优化 2.更优的线段树优化 3.最强的zkw线段树优化 二.SPFA算法 三.分层图最短路 1.(二维分层图)AcWing 340. 通 ...

  7. Bellman 算法实现

    样例输入: 7 0 1 6 0 2 5 0 3 5 1 4 -1 2 1 -2 2 4 1 3 2 -2 3 5 -1 4 6 3 5 6 3 -1 -1 -1 样例输出 1 0→3→2→1 3 0→ ...

  8. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  9. 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别

    关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...

最新文章

  1. IOS进阶之WKWebView
  2. FRAMEBUFFER 显示原理及RGB显示
  3. 对MariaDB10.0的Sphinx进行扩展
  4. C#LeetCode刷题之#400-第N个数字(Nth Digit)
  5. 【JavaFx】eclipse搭建JavaFx开发环境
  6. android开发分页查询,Android开发中实现分页效果的简单步骤
  7. java生日正则表达式_Java语言十五讲
  8. Ubuntu中root用户和user用户的相互切换(转)
  9. 考研政治——马克思主义唯物论之物质观
  10. 王倩兮金碧山水作品《绿水青山就是金山银山》
  11. 回溯法-符号三角形问题
  12. 创意、实现和合作:一次原创H5的尝试
  13. 解决电脑蓝牙可以连接手机电脑等设备却无法连接到耳机的问题
  14. 几个步骤就可以轻松的修改视频尺寸
  15. Ubuntu 14.04+Ros indigo+ORB_SLAM2 的平台搭建
  16. 威纶触摸屏键盘不显示数字_威纶触摸屏功能键使用教程
  17. ElementUi中轮播图走马灯如何实现添加图片
  18. 深入理解line-height和vertical-align
  19. vue.js项目实战运用篇之抖音视频APP-第二节:项目基础架构搭建
  20. [数值计算-5]:一元二次非线性方程求解 - 解析法直接求解

热门文章

  1. 四川大学金融转计算机,[请教]川大和西财哪个金融系好?!
  2. css中设置br标签之后的样式_CSS学习
  3. python调用opengl_Python运行OpenGL示例
  4. 尚学堂java培训_IT培训教育平台课程分享
  5. devc++ 运行时黑屏一闪而过
  6. 飞畅科技-工业以太网的应用现状及前景展望
  7. 【渝粤教育】电大中专幼儿园组织与管理 (10)作业 题库
  8. 【渝粤题库】国家开放大学2021春2476旅游学概论题目
  9. 1818国民经济核算
  10. kafka metric java,jmx_exporter+prometheus+grafana实现kafka metric监控