首页 > 代码库 > 名校联赛第三天A层 Evensgn 的债务题解
名校联赛第三天A层 Evensgn 的债务题解
问题 A: Evensgn 的债务
时间限制: 1 Sec 内存限制: 128 MB题目描述
Evensgn 有一群好朋友,他们经常互相借钱。假如说有三个好朋友 A,B,C。
A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元。Evensgn 是个追求简约
的人,他觉得这样的债务太繁杂了。他认为,上面的债务可以完全等价为 A 欠 C
20 元,B 既不欠别人,别人也不欠他。这样总债务规模就压缩到了 20 元。
现在给定 n 个人和 m 条债务关系。Evensgn 想找到一种新的债务方案,使得
每个人欠钱的总数不变,或被欠钱的总数不变(但是对象可以发生变化),并且使
得总债务规模最小。
输入
输入文件第一行两个数字 n; m,含义如题目所述。
接下来 m 行,每行三个数字 ai; bi; ci,表示 ai 欠 bi 的钱数为 ci。
注意,数据中关于某两个人 A 和 B 的债务信息可能出现多次,将其累加即可。
如”A 欠 B 20 元”、”A 欠 B 30 元”、”B 欠 A 10 元”,其等价为”A 欠 B 40 元”。
输出
输出文件共一行,输出最小的总债务规模。
样例输入
样例输入 1 5 3 1 2 10 2 3 1 2 4 1 样例输入 2 4 3 1 2 1 2 3 1 3 1 1
样例输出
样例输出 1 10 样例输出 2 0
提示
数据范围
对于 30% 的数据,1 ≤ n ≤ 10,1 ≤ m ≤ 10。
对于 60% 的数据,1 ≤ n ≤ 100, 1 ≤ m ≤ 104。
对于 80% 的数据,1 ≤ n ≤ 104,1 ≤ m ≤ 104。
对于 100% 的数据,1 ≤ n ≤ 106,1 ≤ m ≤ 106。
对于所有的数据,保证 1 ≤ ai; bi ≤ n; 0 < ci ≤ 100。
这道题太坑爹了,当时一看就以为是图论题,一股脑就扎进去了,然后一脸颓废的杠了一个半小时,发现挂了,导致此次考试全线崩溃,我对不起老师,对不起组织,对不起HZOI。
这道题当时确实想歪了,这道题和图论八竿子打不到一块。所以让我们从根本上来分析这道问题,首先,债务规模就是所有人欠的债的总和,债务得以转移的前提就是有人在欠钱的同时又被欠钱了,因此既然欠债可以转移,转移给谁不是转移呢,因此我们只要计算出一个人的净欠款,再把所有结算完之后还在欠账的人的欠款总额加在一起,就可以了。
崩爹呢!
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<string> 9 #include<cmath> 10 using namespace std; 11 int n,m,sum[1000005]; 12 int main(){ 13 scanf("%d%d",&n,&m); 14 for(int i=1;i<=m;i++) 15 { 16 int x,y,z; 17 scanf("%d%d%d",&x,&y,&z); 18 sum[x]-=z; 19 sum[y]+=z; 20 } 21 int ans=0; 22 for(int i=1;i<=n;i++) 23 { 24 if(sum[i]<0) 25 ans-=sum[i]; 26 } 27 printf("%d\n",ans); 28 //while(1); 29 return 0; 30 }
名校联赛第三天A层 Evensgn 的债务题解