POJ 3159 Candies 差分约束系统

来源:互联网 发布:龙虎榜数据分析软件2.3 编辑:程序博客网 时间:2024/05/01 17:02
/** * @file main.cpp * @brief 差分约束系统,题意大致如下: *        1号小孩叫snoopy,N号小孩叫flymouse *        N号小孩希望自己的糖果要比1号小孩尽量的多 *        但是需要满足特定约束: * *        设s[i]为i号小孩的糖数,对于约束(a,b,c)的含义是 *        s[b] - s[a] <= c * *        即: *        if (s[a] + c < s[b]) *            s[b] = s[a] + c * *        所以构图是在(a,b)添加权值c,求最小路径s[n] *             * @author yekeren * @version 1.0.0 * @date 2013-06-06 */#include <stdio.h>#include <queue>#define LIMIT 31000#define MAX_INT 0x7fffffff///(M)临接表struct edge_t {    int b, c;    struct edge_t *next;};edge_t *k[LIMIT] = { NULL };edge_t pool[LIMIT * 100];int npool = 0;///(M)堆数据struct item_t {    int d, i;};class lessto{    public:        bool operator()(const item_t &i1, const item_t &i2) const        {            return (i1.d > i2.d);        }};/** * @brief 添加边  * @param a * @param b * @param c */void add_edge(int a, int b, int c){    pool[npool].next = k[a];    pool[npool].b = b;    pool[npool].c = c;    k[a] = &pool[npool++];}/** * @brief shortest path faster algorithm  * @param n * @return    */int dijstra(int n){    int s[LIMIT] = { 0 };    for (int i = 1; i <= n; ++i) {        s[i] = MAX_INT;    }    std::priority_queue<item_t, std::vector<item_t>, lessto> q;    unsigned char visit[LIMIT] = { 0 };    s[1] = 0;    item_t t;    t.d = 0;    t.i = 1;    q.push(t);    while (!q.empty())    {        t = q.top();        q.pop();        int u = t.i;        if (visit[u]) {    //注意这里,重复边的处理            continue;        }        visit[u] = 1;        for (edge_t *p = k[u]; p != NULL; p = p->next)        {            int v = p->b;            int c = p->c;            if (s[u] + c < s[v])            {                s[v] = s[u] + c;                t.d = s[v];                t.i = v;                q.push(t);            }        }    }    return s[n];}int main(int argc, char *argv[]){    int n, m;    scanf("%d%d", &n, &m);    for (int i = 0; i < m; ++i)    {        int a, b, c;        scanf("%d%d%d", &a, &b, &c);        add_edge(a, b, c);    }    printf("%d\n", dijstra(n));    return 0;}

原创粉丝点击