前言
争取一天一题吧。。
感觉状态没有以前好了。。
题意
自己看
题解
网络流是裸的
但应该过不去
考虑到边是双向的
于是我们可以先随便搞出一个生成树
然后边就根据子树的总和来定就可以了
#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;
}