注意到每一个的点出入流是不会变的,因此本质是让构造一张图满足这个出入流并且边上的流量之和最少,显然流量是平衡的,也就是所有节点的出入流之和为0
因此我们可以直接暴力的选择让负数点向正数点连边,连之后就更新每一个点的出入流,直到所有点出入流都为0就结束
int n,m; ll need[maxn]; int main(){ cin>>n>>m; for(int i=0;i<m;i++){ int x,y,z; cin>>x>>y>>z; need[x]-=z; need[y]+=z; } vector<int> pos,neg; for(int i=1;i<=n;i++){ if(need[i]>0) pos.push_back(i); if(need[i]<0) neg.push_back(i); } vector<pair<pair<int,int>,ll>> ans; while(pos.size() && neg.size()) { int y=pos.back(); int x=neg.back(); if(!need[x] || !need[y]) { if(!need[x]) neg.pop_back(); if(!need[y]) pos.pop_back(); continue; } ll flow=min(-need[x],need[y]); need[x]+=flow; need[y]-=flow; ans.push_back({{x,y},flow}); } pf(ans.size()); for(int i=0;i<ans.size();i++){ printf("%d %d %lld ",ans[i].fi.fi,ans[i].fi.se,ans[i].se); } }