zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    bzoj1455-罗马游戏
    bzoj1206-[HNOI2005]虚拟内存
    bzoj2762-[JLOI2011]不等式组
    bzoj2729-[HNOI2012]排队
    [模板] 高精度加/减/乘
    bzoj1013-[JSOI2008]球形空间产生器
    bzoj1002-[FJOI2007]轮状病毒
    什么是Redis缓存穿透、缓存雪崩和缓存击穿
    CentOS 7 中英文桌面安装步骤详细图解
    Redis数据操作
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2937807.html
Copyright © 2011-2022 走看看