Candies POJ

题目链接:https://vjudge.net/problem/POJ-3159

思路:

能看出是差分约束的题,

我们想假设一个人是 p(1),另一个人是p(2),他们之间糖果差为w,

那么需要满足的是 :  p(2) - p(1) <= w,

为了让p(1) 和 p(n)差距最大,我们可以取w,为了满足题目要求

p2 - p1 <= w1, p3 - p2 <= w2,  p3 - p1 <= w3 ... ...  px - py <= wn(举例是任意的两个边要满足),

我们可以建图了,用spfa的话,可以把松弛条件改了,

if(dist[v] - dist[u] > w)  说明不合题目意思了,那么

dist[v] = dist[u] + w;  去更新他。

这里用队列优化spfa不可以,会超时,用栈可以,这里我认为是,栈类似于dfs,一个点的其他情况走到底,

相比于队列类比bfs宽搜,每个点和边都要遍历到,用类似于dfs的方法可以减少其他宽搜的分支。

而且,而且,而且,C++会超时。。。关了输入输出同步也会,c在大量数据输入时,c++还是比不了啊。。。


 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <stack>
 7 #include <string>
 8 #include <map>
 9 #include <cmath>
10 #include <iomanip>
11 using namespace std;
12  
13 typedef long long LL;
14 #define inf 1e9
15 #define rep(i,j,k) for(int i = (j); i <= (k); i++)
16 #define rep__(i,j,k) for(int i = (j); i < (k); i++)
17 #define per(i,j,k) for(int i = (j); i >= (k); i--)
18 #define per__(i,j,k) for(int i = (j); i > (k); i--)
19 
20 const int N = 30010;
21 int head[N];
22 int vis[N];
23 int dist[N];
24 stack<int> sta;
25 int cnt;
26 int n,m;
27 bool ok;
28 
29 struct Edge{
30     int to;
31     int w;
32     int next;
33 }e[150010];
34 
35 inline void add(int u,int v,int w){
36     e[cnt].to = v;
37     e[cnt].w = w;
38     e[cnt].next = head[u];
39     head[u] = cnt++;
40 }
41 
42 void SPFA(){
43 
44     rep(i,2,n) dist[i] = inf;
45     dist[1] = 0;
46     sta.push(1);
47 
48     while(!sta.empty()){
49         int u = sta.top();
50         sta.pop();
51         vis[u] = false;
52 
53         for(int o = head[u]; ~o; o = e[o].next){
54             int v = e[o].to;
55             int w = e[o].w;
56 
57             if(dist[v] - dist[u] > w){
58                 dist[v] = dist[u] + w;
59                 if(!vis[v]){
60                     vis[v] = true;
61                     sta.push(v);
62                 }
63             }
64         }
65     }
66 
67     printf("%d
",dist[n]);
68     // cout << dist[n] << endl;
69 }
70 
71 int main(){
72 
73     // ios::sync_with_stdio(false);
74     // cin.tie(0);
75 
76     scanf("%d%d",&n,&m);
77     // cin >> n >> m;
78     rep(i,1,n) head[i] = -1;
79     cnt = 0;
80 
81     int u,v,w;
82     rep(i,1,m){
83         // cin >> u >> v >> w;
84         scanf("%d%d%d",&u,&v,&w);
85         add(u,v,w);
86     }
87 
88     SPFA();
89 
90     getchar(); getchar();
91     return 0;
92 }
原文地址:https://www.cnblogs.com/SSummerZzz/p/11373484.html