poj 3159 Candies dijkstra + queue

题目链接:

  http://poj.org/searchproblem

题目大意:

  飞天鼠是班长,一天班主任买了一大包糖果,要飞天鼠分发给大家,班里面有n个人,但是学生A认为学生B比自己多的糖果数目不应该大于c,如果不满足自己的条件,学生A就会向老师告状,在这个班级里面泰迪熊的编号是1,班长的编号是n,班长想和泰迪熊的糖果相差最大,问:在满足m个学生的要求后,班长与泰迪熊的糖果相差最大是多少?

解题思路:

  差分约束系统,|Xa-Xb| <= c,我们假设Xa小于Xb,把糖果的最大差当成边权,因为要满足全部人的要求,也就是要求所建图的最短路,用spfa+queue优化tle了,然后我就用了dijkstra+优先队列。感觉用邻接表+优先队列对dijkstra优化真是太美妙了,省去了很多的无用枚举,但是dijkstra的先天不足还是没有办法挽救~~~~

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <queue>
 5 #include <vector>
 6 #include <iostream>
 7 #include <algorithm>
 8 using namespace std;
 9 #define maxn 30010
10
11 struct Edge
12 {
13     int e, w;
14     Edge(int e=0, int w=0) : e(e),w(w) {}
15 };
16
17 bool operator < (const Edge &a, const Edge &b)
18 {
19     return a.w > b.w;//dist小的优先级高
20 }
21
22 vector< vector<Edge> > G;//二维vector
23 //vector<Edge>G[maxn]要比前者慢,估计申请空间需要的时间也比较可观
24 bool vis[maxn];
25 int n;
26
27 void dijkstra();
28
29 int main ()
30 {
31     int m;
32     while (scanf ("%d %d", &n, &m) != EOF)
33     {
34         G.clear();
35         G.resize(n+1);//动态申请空间
36         while (m --)
37         {
38             int a, b, s;
39             scanf ("%d %d %d", &a, &b, &s);
40             G[a].push_back(Edge(b, s));
41         }
42         dijkstra ();
43     }
44     return 0;
45 }
46
47 void dijkstra()
48 {
49     priority_queue<Edge>Q;
50     Edge p, q;
51     memset (vis, false, sizeof(vis));
52     p.e = 1, p.w = 0;
53     Q.push (p);
54
55     while (!Q.empty())
56     {
57         p = Q.top();//选取最优点
58         Q.pop();
59         if (vis[p.e])//已求出最短路,进行下一个
60             continue;
61
62         if (p.e == n)//已求出1到n的最短路
63             break;
64         vis[p.e] = true;
65         int len = G[p.e].size();
66
67         for (int i=0; i<len; i++)
68         {
69             q = G[p.e][i];
70             if ( !vis[q.e] )//对剩余的点进行松弛操作
71             {
72                 q.w += p.w;
73                 Q.push(q);
74             }
75         }
76     }
77     printf ("%d\n", p.w);
78 }
时间: 2024-10-13 10:08:32

poj 3159 Candies dijkstra + queue的相关文章

[2016-04-08][POJ][3159][Candies]

时间:2016-04-08 18:05:09 星期五 题目编号:[2016-04-08][POJ][3159][Candies] 题目大意:n个小孩,m条信息,每条信息a ,b ,c,表示b小孩得到的糖不能比a小孩c个,问n小孩比1小孩最多能多多少个, 分析:直接就是求1到n的最短路(如果不是最短路,那么其他边,总有一种情况不能满足最短路这条边的情况,),直接跑一次Dijkstra 遇到的问题:使用'vector'存图TLE了,改成用数组实现的邻接表才A #include <queue> #i

poj 3159 Candies

题目链接:http://poj.org/problem?id=3159 Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 22516   Accepted: 6047 Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought th

POJ 3159 Candies 差分约束

链接:http://poj.org/problem?id=3159 Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 24852   Accepted: 6737 Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the

POJ 3159 Candies(差分约束系统)

题目地址:POJ 3159 第一发差分约束的题..就当作最短路来做了...直接建图+spfa..不过我用的spfa+slf优化都超时..看了讨论区里的..把spfa换成栈就过了... 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include

(简单) POJ 3159 Candies,Dijkstra+差分约束。

Description 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 ofte

SPFA/Dijkstra POJ 3159 Candies

题目传送门 题意:n个人发糖果,B 比 A 多 C的糖果,问最后第n个人比第一个人多多少的糖果 分析:最短路,Dijkstra 优先队列优化可过,SPFA竟然要用栈,队列超时! 代码: /************************************************ * Author :Running_Time * Created Time :2015-9-1 19:18:52 * File Name :POJ_3159.cpp ************************

poj 3159 Candies(dijstra优化非vector写法)

题目链接:http://poj.org/problem?id=3159 题意:给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c . 最后求n比1最多多多少糖果. 可以从条件中的 B-A<=c及B<=A+c最后要达成这个条件就是要当B>A+c时B=A+c即可 所以差不多就是求最短路.这题中还有一些优化比如 if(vis[u]) continue;这个避免了u点的重复查找 #include <

POJ 3159 Candies(SPFA+栈)差分约束

题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c  最后求fly[n]最多能比so[1] 多多少糖? 差分约束问题, 就是求1-n的最短路,  队列实现spfa 会超时了,改为栈实现,就可以 有负环时,用栈比队列快 数组开小了,不报RE,报超时 ,我晕 #include <iostream> #include <cstdlib> #include <cstdio>

poj 3159 candies (差分约束 spfa+stack)

http://poj.org/problem?id=3159 题意:一个班有n个人 每人分到若干糖果 且u的糖果数不能比v少w个 求第1个人与第n个人最大数量差 照着模板spfa+queue果断tle了 之后照着题解说的把queue改成stack就过了 但是还不明白为什么会快 而且如果用数组直接模拟会比stl更快 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>