POJ3159 Candies(差分约束)

题目链接

分析:

这题很简单。就是差分约束。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[n]-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;
}

 

posted on 2013-02-28 21:56  Still_Raining  阅读(490)  评论(0编辑  收藏  举报