CF1266D Decreasing Debts
题目描述
这个世界上有 $n$ 个人,编号为 $1$ 到 $n$。他们使用 burles 购买商品和服务。有时候,一个人可能没有足够的货币来购买他想要或需要的东西,于是他会向别人借钱,并打算以后连本带息偿还这笔贷款。记 $d(a,b)$ 表示 $a$ 欠 $b$ 的债务金额,如果没有这笔债务则为 $0$。
有时,这种情况会变得非常复杂,因为出借人可能在债务人还钱之前遇到经济困难,自己也需要向别人借钱。
当这种过程持续足够长的时间后,可能会出现很多债务,这些债务可以进行合并。合并的方法有两种:
1. 设 $d(a,b) > 0$ 且 $d(c,d) > 0$,其中 $a \neq c$ 或 $b \neq d$。我们可以将 $d(a,b)$ 和 $d(c,d)$ 各减少 $z$,同时将 $d(c,b)$ 和 $d(a,d)$ 各增加 $z$,其中 $0 < z \leq \min(d(a,b), d(c,d))$。
2. 设 $d(a,a) > 0$。我们可以将 $d(a,a)$ 设为 $0$。
总债务定义为所有债务的和:
$$
\Sigma_d = \sum_{a,b} d(a,b)
$$
你的目标是任意次、任意顺序地使用上述两种操作,使总债务尽可能小。注意,你不需要最小化非零债务的数量,只需最小化总债务。
输入格式
第一行包含两个用空格分隔的整数 $n$($1 \leq n \leq 10^5$)和 $m$($0 \leq m \leq 3 \cdot 10^5$),分别表示人数和债务数。
接下来 $m$ 行,每行包含三个用空格分隔的整数 $u_i$、$v_i$($1 \leq u_i, v_i \leq n, u_i \neq v_i$)、$d_i$($1 \leq d_i \leq 10^9$),表示 $u_i$ 向 $v_i$ 借了 $d_i$ 个 burles。
输出格式
第一行输出一个整数 $m'$($0 \leq m' \leq 3 \cdot 10^5$),表示合并后剩余的债务数。可以证明一定存在满足该条件的解。
接下来输出 $m'$ 行,每行包含三个用空格分隔的整数 $u_i, v_i, d_i$,表示 $u_i$ 恰好欠 $v_i$ $d_i$ 个 burles。输出需满足 $1 \leq u_i, v_i \leq n$,$u_i \neq v_i$ 且 $0 < d_i \leq 10^{18}$。
对于每对 $i \neq j$,应满足 $u_i \neq u_j$ 或 $v_i \neq v_j$,即每对人之间最多只出现一次债务。
说明/提示
在第一个样例中,最优的操作序列可以如下:
1. 对 $a=1$,$b=2$,$c=2$,$d=3$,$z=5$ 执行第一种操作。此时债务为:$d(1,2)=5$,$d(2,2)=5$,$d(1,3)=5$,其余债务为 $0$;
2. 对 $a=2$ 执行第二种操作。此时债务为:$d(1,2)=5$,$d(1,3)=5$,其余债务为 $0$。
在第二个样例中,最优的操作序列可以如下:
1. 对 $a=1$,$b=2$,$c=3$,$d=1$,$z=10$ 执行第一种操作。此时债务为:$d(3,2)=10$,$d(2,3)=15$,$d(1,1)=10$,其余债务为 $0$;
2. 对 $a=2$,$b=3$,$c=3$,$d=2$,$z=10$ 执行第一种操作。此时债务为:$d(2,2)=10$,$d(3,3)=10$,$d(2,3)=5$,$d(1,1)=10$,其余债务为 $0$;
3. 对 $a=2$ 执行第二种操作。此时债务为:$d(3,3)=10$,$d(2,3)=5$,$d(1,1)=10$,其余债务为 $0$;
4. 对 $a=3$ 执行第二种操作。此时债务为:$d(2,3)=5$,$d(1,1)=10$,其余债务为 $0$;
5. 对 $a=1$ 执行第二种操作。此时债务为:$d(2,3)=5$,其余债务为 $0$。
由 ChatGPT 4.1 翻译