题目链接: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 }