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 }