POJ 3159 Candies 差分约束系统

题目:http://poj.org/problem?id=3159


题意:给n个小朋友发糖果,有如下一些关系:a b c,代表第b个人得到的糖果不多于第a个人c个,即b - a <= c。最后在满足所有关系的情况下,求第n个人比第1个人多了多少糖果


思路:初识差分约束系统,最短路倒是很久以前就会了。。。b - a <= c转换成b <= a + c,这是差分约束系统的标准形式,于是从a向b建边,权值为c。执行完最短路后,有dis[n] - dis[1] <= res,题目求最大值,即为dis[n] - dis[1] = res


总结:终于见到了大神吐槽的最短路求不等式

#include 
#include 
#include 
#include 
#include 
using namespace std;

const int N = 30010;
typedef pair P;
struct node
{
    int to, cost, next;
}g[N*5];
int head[N], dis[N], used[N];
int n, m, cnt;
void add_edge(int v, int u, int cost)
{
    g[cnt].to = u;
    g[cnt].cost = cost;
    g[cnt].next = head[v];
    head[v] = cnt++;
}
void dijkstra(int s, int t)
{
    priority_queue, greater

> que; used[s] = true; dis[s] = 0; que.push(P(0, s)); while(! que.empty()) { P p = que.top(); que.pop(); int v = p.second; if(dis[v] < p.first) continue; for(int i = head[v]; i != -1; i = g[i].next) { int u = g[i].to; if(dis[u] > dis[v] + g[i].cost) dis[u] = dis[v] + g[i].cost, que.push(P(dis[u], u)); } } } int main() { int a, b, c; while(~ scanf("%d%d", &n, &m)) { memset(head, -1, sizeof head); memset(dis, 0x3f, sizeof dis); memset(used, 0, sizeof used); cnt = 0; for(int i = 0; i < m; i++) { scanf("%d%d%d", &a, &b, &c); add_edge(a, b, c); } dijkstra(1, n); printf("%d\n", dis[n]); } return 0; }



你可能感兴趣的:(差分约束系统,最短路)