Educational Codeforces Round 45 (Rated for Div. 2) F. Flow Control

前言

争取一天一题吧。。
感觉状态没有以前好了。。

题意

自己看

题解

网络流是裸的
但应该过不去
考虑到边是双向的
于是我们可以先随便搞出一个生成树
然后边就根据子树的总和来定就可以了

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N=200005*2;
int n,m;
int a[N];
int f[N];
struct qq
{
    int x,y,z,last;
}e[N];int num,last[N];
int find (int x)    {return f[x]==x?f[x]:f[x]=find(f[x]);}
void init (int x,int y)
{
    num++;
    e[num].x=x;e[num].y=y;
    e[num].last=last[x];
    last[x]=num;
}
int X[N],Y[N];
int sum=0;
int dep[N];
void dfs (int x,int fa)
{
    for (int u=last[x];u!=-1;u=e[u].last)
    {
        int y=e[u].y;
        if (y==fa) continue;
        dep[y]=dep[x]+1;
        dfs(y,x);
        a[x]=a[x]+a[y];
    }
}
bool used[N];
int main()
{
    memset(used,false,sizeof(used));
    num=0;memset(last,-1,sizeof(last));
    scanf("%d",&n);
    for (int u=1;u<=n;u++)  
    {
        scanf("%d",&a[u]);
        sum=sum+a[u];
    }
    for (int u=1;u<=n;u++)  f[u]=u;
    scanf("%d",&m);
    for (int u=1;u<=m;u++)
    {
        scanf("%d%d",&X[u],&Y[u]);
        int fx=find(X[u]),fy=find(Y[u]);
        if (fx==fy) continue;
        f[fx]=fy;
        init(X[u],Y[u]);init(Y[u],X[u]);
        used[u]=true;
    }
    if (sum!=0) {printf("Impossible\n");return 0;}
    printf("Possible\n");
    dfs(1,0);
    for (int u=1;u<=m;u++)
    {
        if (used[u]==false) printf("0\n");
        else
        {
            if (dep[X[u]]>dep[Y[u]])
            {
                printf("%d\n",-a[X[u]]);
            }
            else
            {
                printf("%d\n",a[Y[u]]);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36797743/article/details/80664232