码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1266D] Decreasing Debts

时间:2020-03-23 13:46:20      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:long   vector   item   als   lang   tmp   i++   min   space   

现有 \(n\) 个人,有 \(m\) 对欠债关系:\(d(a,b)\) 表示 \(a\)\(b\ d(a,b)\) 元。现要给出一个最终的欠债关系,使得 \(\sum d\)最小。

Solution

只需要记录每个点输出和输入的总量,正负各成一部,然后正部向着负部做类似匹配的操作即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

struct item {int a,b,c;};

int n,m,u,v,w,d[N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        cin>>u>>v>>w;
        d[u]-=w;
        d[v]+=w;
    }
    int pos=1;
    vector <item> vec;
    for(int i=1;i<=n;i++) {
        while(d[i]>0) {
            while(d[pos]>=0&&pos<=n) ++pos;
            int tmp=min(-d[pos],d[i]);
            d[pos]+=tmp;
            d[i]-=tmp;
            vec.push_back({pos,i,tmp});
        }
    }
    cout<<vec.size()<<endl;
    for(item i:vec) cout<<i.a<<" "<<i.b<<" "<<i.c<<endl;
}

[CF1266D] Decreasing Debts

标签:long   vector   item   als   lang   tmp   i++   min   space   

原文地址:https://www.cnblogs.com/mollnn/p/12551716.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!