Codeforces990 F. Flow Control(思维,利用生成树构造)

Posted live4m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces990 F. Flow Control(思维,利用生成树构造)相关的知识,希望对你有一定的参考价值。

题意:

在这里插入图片描述

解法:

由于流量守恒,如果s[]的总和不为0那么一定无解,否则一定有解.

考虑如何构造解:
根据数据范围可以想到,sum{|f[i]|}<=2e9,因此f[i]可以任取,
建出无向图,选出图中的任意一颗生成树,任取一点为根开始dfs,
子节点需要的s值由父节点提供,显然这样一定能构造出一组解.

code:

#include<bits/stdc++.h>
#define PI pair<int,int>
using namespace std;
const int maxm=2e5+5;
vector<PI>g[maxm];
int mark[maxm];
int ans[maxm];
int s[maxm];
int n,m;
void dfs(int x){
    mark[x]=1;
    for(auto i:g[x]){
        int v=i.first,id=i.second;
        if(mark[v])continue;
        dfs(v);
        ans[abs(id)]=s[v]*(id>0?1:-1);
        s[x]+=s[v];
    }
}
void solve(){
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++)cin>>s[i],sum+=s[i];
    if(sum!=0){
        cout<<"Impossible"<<endl;return ;
    }
    cin>>m;
    for(int i=1;i<=m;i++){
        int a,b;cin>>a>>b;
        g[a].push_back({b,i});//i和-i是用来保存边的编号,以及方向的.
        g[b].push_back({a,-i});
    }
    dfs(1);
    cout<<"Possible"<<endl;
    for(int i=1;i<=m;i++){
        cout<<ans[i]<<endl;
    }
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    solve();
    return 0;
}

以上是关于Codeforces990 F. Flow Control(思维,利用生成树构造)的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 990EPost Lamps

CodeForces 990ACommentary Boxes

Codeforces 990

CodeForces 990C

CodeForces 990B

CodeForces 990C Bracket Sequences Concatenation Problem