POJ3159 Candies(差分约束)
2013-02-28 21:56
288 查看
题目链接。
分析:
这题很简单。就是差分约束。d[B]-d[A]<=C。不过在用spfa提交时一直TLE。不明白为什么,一查才知道这题要用栈(据说栈有时会比队列快?)。。虽说AC了。但总觉得。莫名其妙。思考一番,应该是对spfa的优化不是很了解。再者,听说用dijkstra+heap一般不会被卡住,所以我决定要开始学习堆、以及spfa的各种优化了。。加油。加油!!!
分析:
这题很简单。就是差分约束。d[B]-d[A]<=C。不过在用spfa提交时一直TLE。不明白为什么,一查才知道这题要用栈(据说栈有时会比队列快?)。。虽说AC了。但总觉得。莫名其妙。思考一番,应该是对spfa的优化不是很了解。再者,听说用dijkstra+heap一般不会被卡住,所以我决定要开始学习堆、以及spfa的各种优化了。。加油。加油!!!
#include <cstdio> #include <stack> using namespace std; #define MAXN 30010 #define MAXM 150010 const int INF = (1<<24); struct node{ int v, w; int next; }edge[MAXM]; stack<int> s; int head[MAXN], d[MAXN], vis[MAXN], n, m, top; void Init(){ top = 0; for(int i=1; i<=n; i++){ head[i] = -1; d[i] = INF; vis[i] = 0; } } void add(int u, int v, int w){ edge[top].v = v; edge[top].w = w; edge[top].next = head[u]; head[u] = top++; } int spfa(){ int u, i, v, w; d[1] = 0; vis[1] = 0; s.push(1); while(!s.empty()){ u = s.top(); s.pop(); vis[u] = 0; for(i=head[u]; i != -1; i = edge[i].next){ v = edge[i].v; w = edge[i].w; if(d[v]>d[u]+w){ d[v] = d[u]+w; if(!vis[v]){ vis[v]=1; s.push(v); } } } } return d -d[1]; } int main(){ int i, u, v, w; scanf("%d %d", &n, &m); Init(); for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); add(u, v, w); } printf("%d\n", spfa()); return 0; }
相关文章推荐
- 差分约束 poj3159 Candies
- POJ3159 Candies(差分约束)
- poj3159--Candies(差分约束)
- POJ3159:Candies(差分约束)
- poj3159 Candies(差分约束,最短路)
- poj3159 Candies(差分约束)
- poj3159 Candies(差分约束)
- POJ3159 Candies(差分约束 PS:此题spfa+队列过不了,spfa + stack才能过)
- POJ 3159 Candies(差分约束)
- POJ3159(KB4-K 差分约束)
- poj3159 最短路(差分约束)
- POJ3159_Candies_差分约束_SPFA
- POJ3159 Candies(差分约束)
- poj--3159--Candies(简单差分约束)
- POJ 3159 Candies(差分约束)
- poj3159(差分约束)
- [差分约束]POJ 3159——Candies
- POJ 3159 Candies (差分约束 Dijkstra+优先队列 SPFA+栈)
- poj 3159 Candies(差分约束)
- poj 3159 Candies(差分约束)