Candies POJ - 3159 差分约束典型例题

在幼儿园的时候,Flymouse是班上的班长。有时班主任会给班上的孩子们带来一大袋糖果,让他们分发。所有的孩子都非常喜欢糖果,经常比较他们和别人买的糖果的数量。一个孩子A可以有这样的想法,尽管可能是另一个孩子B在某些方面比他好,因此他有理由比他应得更多的糖果,但无论他实际得到多少糖果,他都不应该得到比B少的一定数量的糖果,否则他会感到不满意。 Flymouse总是把他的糖果和snoopy的比较,他想在让每个孩子都满意的同时,尽可能使自己的糖比snoopy的多。现在他又从班主任那里得到了一袋糖果,他最多能比snoopy多拿到几颗糖?Input输入包含单个测试用例。测试用例以两个整数n和m开始,分别不超过30000和150000。n是班上的孩子数,孩子数从1到n。snoopy和flymouse总是分别是1和n。然后按照m行,每一行依次包含三个整数a、b和c,这意味着孩子a相信孩子b永远不会比他得到的多于c颗糖果。Output只输出一行可能达到的最大差异。保证差异是有限的。Sample Input

2 2
1 2 5
2 1 4

Sample Output

5

Hint32位有符号整数类型可以执行所有算术运算。

吐槽一句:网上一直说会卡vector,但是事实说明vector也是可以过得。。。。。。

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<queue>
 5 #include<vector>
 6 #include<map>
 7 #include<stack>
 8 #include<string>
 9 #include<cmath>
10 #include<sstream>
11 #include<cstring>
12 #include<set>
13 using namespace std;
14 typedef long long int ll;
15 typedef unsigned long long int ull;
16 inline int rd() {
17     int X = 0, w = 0;char ch = 0;while (!isdigit(ch)) { w |= ch == '-';ch = getchar(); }
18     while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X;
19 }
20 #define bug  puts("DEBUG*******************************")
21 #define in(a) int n = rd()
22 #define pi acos(-1)
23 #define pb push_back
24 #define rep(i,a,n) for(int i=a;i<=n;++i)
25 #define per(i,a,n) for(int i=a;i>=n;--i)
26 #define sld(n) scanf("%lld",&n)
27 #define sldd(n,m) scanf("%lld %lld",&n,&m)
28 #define pd(n) printf("%d\n",n)
29 #define pld(n) printf("%lld\n",n)
30 #define mem(a,b) memset(a,b,sizeof a)
31 #define Case(T) int T=rd();while (T--)
32 #pragma comment(linker, "/STACK:102400000,102400000")
33 const double eps = 1e-8;
34 const int inf = 0x3f3f3f3f;
35 const ll INF = 0x3f3f3f3f3f3f3f3f;
36 const int MOD = 1e5 + 7;
37 const int maxn = 2e5+10;
38 int n, m, s, t;
39 int ans = 0;
40 int a[maxn], b[maxn], c[maxn], dis[maxn];
41 bool vis[maxn];
42 struct edge {
43     int from, to, w;
44 };
45 vector<edge>e[maxn];
46 struct node {
47     int id, n_dis;
48     bool operator<(const node& a)const { return n_dis > a.n_dis; }
49 };
50 void dij(int s) {
51     for (int i = 1;i <= n;i++)dis[i] = inf, vis[i] = false;
52     dis[s] = 0;
53     priority_queue<node>Q;
54     Q.push(node{ s,dis[s] });
55     while (!Q.empty()) {
56         node u = Q.top();
57         Q.pop();
58         if (vis[u.id])continue;
59         vis[u.id] = true;
60         int len = e[u.id].size();
61         for (int i = 0;i < len;i++) {
62             edge y = e[u.id][i];
63             if (vis[y.to])continue;
64             if (dis[y.to] > y.w + u.n_dis) {
65                 dis[y.to] = y.w + u.n_dis;
66                 Q.push({ y.to,dis[y.to] });
67             }
68         }
69     }
70 
71 }
72 int main()
73 {
74     n = rd(), m = rd();
75     for (int i = 1;i <= m;i++) {
76         a[i] = rd(), b[i] = rd(), c[i] = rd();
77         e[a[i]].push_back(edge{ a[i],b[i],c[i] });
78     }
79     dij(1);
80     pd(dis[n]);
81 }

 

posted @ 2020-07-29 19:51  programmer_w  阅读(0)  评论(0)    收藏  举报