POJ 3159 Candies 【差分约束】

传送门
题意: 给定n个限制关系u v w表示u认为v的糖果数量最多比它多w个. 问在满足这些的条件下, 1与n的糖果数量最大的差是多少.

思路: 知道差分约束的很容易可以判断出这个是差分约束, 我们用d数组表示一个人拥有的糖果数量那么结合题意就有d[u] + w >= d[v], 也就是类似于最短路中的松弛条件dis[u] + g[u][v] <= dis[v], 只是形式上有点不同, 但是它的实际意思却是很相似的, 所以我们u - v 连一条权值为w的边, 所以求1 - n最大差(最大值)也就是跑1 - n 的最短路即是ans.
(不懂的建议先学学差分约束)

AC Code

const int maxm = 2e5 + 5;
int n, m;
struct node
{
    int to, next, w;
    bool operator < (const node& a) const {
        return w > a.w;
    }
} e[maxm];

int cnt, head[maxn];
void add(int u, int v,int w) {
    e[cnt] = (node){v, head[u], w};
    head[u] = cnt++;
}

void init() {
    cnt = 0;
    Fill(head, -1);
}

bool vis[maxn];
int dis[maxn];
void dij(int st,int ed)
{
    priority_queue<node> q;
    Fill(dis,inf); Fill(vis,0);
    dis[st] = 0;
    q.push((node){st, 0, 0});
    while (!q.empty()) {
        node u = q.top();
        q.pop();
        if(vis[u.to]) continue;
        vis[u.to] = 1;

        for (int i = head[u.to]; ~i; i = e[i].next) {
            int to = e[i].to;
            if (dis[to] > dis[u.to] + e[i].w) {
                dis[to] = dis[u.to] + e[i].w;
                q.push((node){to, 0, dis[to]});
            }
        }
    }
    cout << dis[ed] << endl;
}
void solve()
{
    scanf("%d%d", &n, &m);
    init();
    for (int i = 1 ; i <= m ; i ++) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w);
    }
    dij(1, n);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值