您的位置:首页 > 其它

POJ3159 Candies(差分约束)

2013-02-28 21:56 288 查看
题目链接

分析:

这题很简单。就是差分约束。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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: