• POJ 3159 :Candies 【线性差分约束 链式前向星 栈优化SPFA】


    Candies POJ - 3159

    题意:
    给N个小朋友分糖, 给出M组约束a, b, c表示b的糖果不能比a多c个以上, 求1号和N号的最大糖果差异数

    题解:
    非常显然的线性查分约束问题
    对于a, b, c表示b的糖果不能比a多c个以上 , 即cnt[a]+c >= cnt[b], 可以理解为a指向b的一条权值为c的单向边.
    这样一来整个系统也就转换成了图, 而对于求1和N的最大差异数, 即cnt[N]-cnt[1] 的最大值, 即1到N的最短路

    求最短路时可用堆优化Dijkstra和栈优化SPFA两种

    经验小结:
    搞清楚差分约束的是最短路还是最长路

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <stdlib.h>
    #include <vector>
    #include <queue>
    #include <cmath>
    #include <stack>
    #include <map>
    #include <set>
    using namespace std;
    #define ms(a,b) memset(a,b,sizeof(a));
    typedef long long ll;
    const int inf = 1 << 30;
    const ll maxn = 300010;
    
    int n, m, edgeCnt = 0, head[maxn];
    struct node {
    	int to, w, next;
    	node(int tt, int ww, int nn) { to = tt, w = ww, next = nn; }
    	node() {}
    }es[maxn];
    
    int d[maxn];
    bool book[maxn];
    
    inline int read() {
    	int s = 0, w = 1;
    	char ch = getchar();
    	while (ch < '0' || ch>'9') { if (ch == '-')w = -1; ch = getchar(); }
    	while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    	return s * w;
    }
    
    void add(int u, int v, int w) {
    	es[edgeCnt] = { v,w,head[u] };
    	head[u] = edgeCnt++;
    }
    
    void spfa(int s) {
    	stack<int>st;
    	fill(d, d + maxn, inf);
    	d[1] = 0, book[1] = true;
    	st.push(1);
    	while (!st.empty()) {
    		int u = st.top();
    		st.pop();
    		book[u] = false;
    		for (int i = head[u]; i != -1; i = es[i].next) {
    			int v = es[i].to, w = es[i].w;
    			if (d[u] + w < d[v]) {
    				d[v] = d[u] + w;
    				if (!book[v]) {
    					st.push(v);
    					book[v] = true;
    				}
    			}
    
    		}
    	}
    }
    
    int main() {
    	ms(head, -1);
    	//ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    	n = read(), m = read();
    	while (m--) {
    		int a, b, c;
    		a = read(),b=  read(), c =read();
    		add(a, b, c);
    	}
    	spfa(1);
    	cout << d[n] << endl;
    	return 0;
    }
    
  • 相关阅读:
    几种基本样式,背景图,字体,下划线,行高垂直等
    网页主菜单,横向
    DOM操作
    递归的小例题
    学习两个星期后做的第一个网页
    Js的语法和循环
    JS
    75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。[2行核心代码]
    74 使用BitSet输出数组中的重复元素
    73 [面试题]交换一个整数的二进制表示的奇偶位(swapOddEvenBits)
  • 原文地址:https://www.cnblogs.com/RioTian/p/12939369.html
Copyright © 2020-2023  润新知