cf1266D


注意到每一个的点出入流是不会变的,因此本质是让构造一张图满足这个出入流并且边上的流量之和最少,显然流量是平衡的,也就是所有节点的出入流之和为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\n",ans[i].fi.fi,ans[i].fi.se,ans[i].se);
}
}
浙公网安备 33010602011771号