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(思维,利用生成树构造)的主要内容,如果未能解决你的问题,请参考以下文章