题解:CF269C Flawed Flow
题目传送门
题目大意
给出一个无向图,给出每条边的流量,要求给每条边定向,使得这个图成为一个合格的网络流图。
思路
因为最终的图一定是一个有向无环图,所以我们可以使用拓扑排序来解决这个问题。首先,求出经过每条边的流量,因为起点和终点给定,所以我们可以先把起点放入队列,再给与起点相连的点,减去对应的边权,如果减去后等于 \(0\),则入队。重复操作,直到队列为空。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1010101;
ll n,m,f[N],ans[N];
struct node{ll to,w,id;};
vector<node>e[N];
queue<ll>q;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
ll u,v,w;
cin>>u>>v>>w;
e[u].push_back({v,w,i});
e[v].push_back({u,w,i+m});
f[u]+=w;
f[v]+=w;
}
for(int i=2;i<n;i++)f[i]>>=1;
f[1]=0;
q.push(1);
while(!q.empty()){
ll u=q.front();
q.pop();
for(auto now:e[u]){
ll v=now.to;
ll w=now.w;
ll id=now.id;
if(!f[v])continue;
f[v]-=w;
if(id>m)ans[id-m]=1;
else ans[id]=0;
if(!f[v])q.push(v);
}
}
for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';
return 0;
}

浙公网安备 33010602011771号