题目大意:
小 G 有一群好朋友,他们经常互相借钱。假如说有三个好朋友 A,B,C。A
欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元。小 G 是个追求简约的人,他觉得这样的债务太繁杂了。他认为,上面的债务可以完全等价为 A 欠 C 20 元,B 既不欠别人,别人也不欠他。这样总债务规模就压缩到了 20 元。
现在给定 n 个人和 m 条债务关系。小 G 想找到一种新的债务方案,使得每个
人欠钱的总数不变,或被欠钱的总数不变(但是对象可以发生变化),并且使得总债务规模最小。
解题思路:
第一遍做的时候硬是没看懂题目,以为要用奇奇怪怪的方法。没想到题解这么简单。。。
其实就是个简单的模拟呀,如果a欠b c元,用数组存下a欠的钱数,即A[a]+=c;同样b也少欠c元,A[b]-=c;
最后再把A[]>0的加起来就OK了。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
const int max_n = 1e6 + 10;
const int max_m = 1e6 + 10;
int a[max_n];
inline int read();//复习一下快速读入
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){
if (ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int main()
{
// freopen("debt.in", "r", stdin);
// freopen("debt.out", "w", stdout);
int n=read();
int m=read();
for (int i=1;i<=m;i++)
{
int u,v,w;
u=read();v=read();w=read();
a[u]+=w;a[v]-=w;
}
int ans=0;
for (int i=1;i<=n;i++)
if (a[i]>0) ans+=a[i];
cout <<ans<<endl;
}