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;
    }
  • 相关阅读:
    SQL 去重 DISTINCT 语法
    urllib2 urllib urllib3的区别联系
    urllib库中常见的类和方法
    python模块之json pickle
    python os模块
    python的常见内置模块之-----time
    列表,队列,栈,链表的内存模型
    open函数
    session和cookie
    随笔小skill
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2937807.html
Copyright © 2011-2022 走看看