题解: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;
}
posted @ 2025-09-07 21:46  一班的hoko  阅读(7)  评论(0)    收藏  举报