Codeforces Global Round 6

借了钱,然后合并,问合并完最少还有几个人之间有金钱纠纷
借的钱和欠的钱总数相等,直接O(n)的把每个人的钱都合并了,只管这个人欠了多少钱,不管欠的谁钱

struct node{
	int x,y;
	ll z;

};
ll sum[MAXN];
void work() {
	vector<int> v1,v2;
	int n,m;
	cin >> n >> m;
	for(int i = 1; i <= m; i++) {
		int x,y;ll z;
		cin >> x >> y >> z;
		sum[x] -= z; sum[y] += z;
	}
	for(int i = 1; i <= n; i++) {
		if(sum[i] < 0) {
			v1.push_back(i);
			sum[i] = -sum[i];
		}
		else if(sum[i] > 0) v2.push_back(i);
	}
	vector<node>ans;
	int i = 0,j = 0;
	while(i < v1.size() && j < v2.size()) {
		int u = v1[i];
		int v = v2[j];
		node k;
		k.x = u;
		k.y = v;
		k.z = min(sum[u],sum[v]);
		ans.push_back(k);
		ll tmp = min(sum[u],sum[v]);
		sum[u] -= tmp;
		sum[v] -= tmp;
		if(sum[u] == 0) i++;
		if(sum[v] == 0) j++;
	}
	cout << ans.size() << endl;
	for(int i = 0; i < ans.size(); i++) {
		cout << ans[i].x << ' ' << ans[i].y << ' ' << ans[i].z << endl;
	}
}

int main() {
	work();
	return 0;
}

偷偷说李涵学长是个夯货

原文地址:https://www.cnblogs.com/ASLHZXY/p/12109053.html