poj3159
2016-04-21 11:57
337 查看
During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the kids of flymouse’s class a large bag of candies and had flymouse distribute them. All the kids loved candies very much and often compared the numbers of candies they got with others. A kid A could had the idea that though it might be the case that another kid B was better than him in some aspect and therefore had a reason for deserving more candies than he did, he should never get a certain number of candies fewer than B did no matter how many candies he actually got, otherwise he would feel dissatisfied and go to the head-teacher to complain about flymouse’s biased distribution.
snoopy shared class with flymouse at that time. flymouse always compared the number of his candies with that of snoopy’s. He wanted to make the difference between the numbers as large as possible while keeping every kid satisfied. Now he had just got another bag of candies from the head-teacher, what was the largest difference he could make out of it?
Input
The input contains a single test cases. The test cases starts with a line with two integers N and M not exceeding 30 000 and 150 000 respectively. N is the number of kids in the class and the kids were numbered 1 through N. snoopy and flymouse were always numbered 1 and N. Then follow M lines each holding three integers A, B and c in order, meaning that kid A believed that kid B should never get over c candies more than he did.
Output
Output one line with only the largest difference desired. The difference is guaranteed to be finite.
Sample Input
2 2
1 2 5
2 1 4
Sample Output
5
Hint
32-bit signed integer type is capable of doing all arithmetic.
Source
POJ Monthly–2006.12.31, Sempr
snoopy shared class with flymouse at that time. flymouse always compared the number of his candies with that of snoopy’s. He wanted to make the difference between the numbers as large as possible while keeping every kid satisfied. Now he had just got another bag of candies from the head-teacher, what was the largest difference he could make out of it?
Input
The input contains a single test cases. The test cases starts with a line with two integers N and M not exceeding 30 000 and 150 000 respectively. N is the number of kids in the class and the kids were numbered 1 through N. snoopy and flymouse were always numbered 1 and N. Then follow M lines each holding three integers A, B and c in order, meaning that kid A believed that kid B should never get over c candies more than he did.
Output
Output one line with only the largest difference desired. The difference is guaranteed to be finite.
Sample Input
2 2
1 2 5
2 1 4
Sample Output
5
Hint
32-bit signed integer type is capable of doing all arithmetic.
Source
POJ Monthly–2006.12.31, Sempr
/* solution: 求低N个孩子比第一个孩子多分多少糖果,其实就是求最短路径问题 读入x y z时,相当与在节点xy之间添加一条权值为z的有向边 直接套模板即可,此题中源点为1。 note: 1.G.resize(n + 1),调整容器的长度大小,使其能容纳n个元素。 2.自定义比较器,对<进行重载,使得在优先队列中能够使用结构体。 3.同1有关。vector<vector<edgeNode> > G这样子比较快,vector对象的初始化也需要时间的。 date: 2016/4/21 */ #include <iostream> #include <cstdio> #include <queue> #include <vector> #include <cstring> using namespace std; const int maxn = 30000 + 5; const int maxm = 150000 + 5; const int INF = 100000000; int dist[maxn], vis[maxn], n, m; struct edgeNode { int node, val; //结点以及通向该结点的一条有向边的权值 edgeNode(int node = 0, int val = 0) : node(node), val(val) {} bool operator < (const edgeNode& rhs) const { return val > rhs.val; //自定义的比较器,构建的是小顶堆,从小到大出列 } }; vector<vector<edgeNode> > G; //用来存储图,用该方法比定义vector<edgeNode> G[maxn]快 int dijkstra() { memset(vis, 0, sizeof(vis)); priority_queue<edgeNode> q; q.push(edgeNode(1, 0)); dist[1] = 0; //先初始化,并将开始节点1压入优先队列 while(!q.empty()) { edgeNode u = q.top(); q.pop(); //取出优先队列的队头,并将其出列 if(vis[u.node]) continue; //如果已经访问过,就将其丢弃,继续出列下一个结点 if(u.node == n) break; //说明第n个孩子已经求出来了,就可以直接跳出循环 vis[u.node] = 1; for(int i = 0; i < G[u.node].size(); i++) { //寻找与其相邻的结点和路径 edgeNode e = G[u.node][i]; if(dist[e.node] > dist[u.node] + e.val) { dist[e.node] = dist[u.node] + e.val; q.push(e); } } } return dist ; } int main() { //freopen("input.txt", "r", stdin); scanf("%d%d", &n, &m); int u, v, val; G.resize(n + 1); //给vector初始化n+1个元素,不然调用“G[u].push_back(edgeNode(v, val));”时候会发生越界 for(int i = 0; i < m; i++) { scanf("%d%d%d", &u, &v, &val); G[u].push_back(edgeNode(v, val)); //在调用此行时一定记得先resize(); } //读入数据 for(int i = 1; i <= n; i++) dist[i] = INF; //初始化 int ans = dijkstra(); printf("%d\n", ans); }
相关文章推荐
- Ethereal 使用
- Thinkphp分页类使用
- mysql创建用户并分配权限
- C# Winform聊天程序[两端通信]
- 单臂路由
- javascript中字符和ascii互换
- 认知有偏差,结论需谨慎
- java内部类使用场景体会
- Linux安装其他版本GCC的方法
- 外部排序
- Irrlicht引擎学习笔记(0)--写在开始
- ifconfig无输出的解决办法
- Memcached
- Hibernate各种主键生成策略与配置详解
- 分布式系统基础
- 闲话选择排序算法
- UVA 211 The Domino Effect
- Android控件布局属性全解
- JQuery输入框获取/失去焦点行为
- Android: LG G3无法连接Mac的解决办法