NOIP模拟 水管(水题)
传送门
【题目分析】
为什么打了endl竟然没T。。。但为什么交到网站上又T了
氵题嘛,做法有很多种啊。。。。
我选择加N-1条边,这样就保证了联通,直接dfs一遍记录儿子,边权就是儿子的值,注意修改反向边。
然后一群人拿着我的程序去比谁跑得快
【代码~(呵呵呵呵呵)】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
const int MAXM=4e5+10;
int n,m,cnt=2,sum;
int a[MAXN];
int head[MAXN];
int nxt[MAXM],to[MAXM],w[MAXM];
int bian[MAXM],vis[MAXN];
const int RLEN=1<<18|1;
inline char nc() {
static char ibuf[RLEN],*ib,*ob;
(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
return (ib==ob) ? -1 : *ib++;
}
inline int Read() {
char ch=nc(); register int i=0,f=1;
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=nc();}
while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
return i*f;
}
inline void sc(int x){
if(x<0)
putchar('-'),x=-x;
if(x>=10)
sc(x/10);
putchar(x%10^48);
}
inline void add(const int &x,const int &y){
nxt[cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
cnt++;
}
void dfs(const int &u,const int &f){
for(register int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==f)
continue;
dfs(v,u);
w[i]=a[v];
w[i^1]=-a[v];
a[u]+=a[v];
}
}
int main(){
n=Read();
for(register int i=1;i<=n;++i)
a[i]=Read(),sum+=a[i];
m=Read();
int x,y;
for(register int i=1;i<=m;++i){
x=Read(),y=Read();
if(vis[x]&&vis[y])
continue;
bian[i]=cnt>>1;
add(x,y),add(y,x);
vis[x]=vis[y]=1;
}
if(sum!=0){
puts("Impossible");
return 0;
}
puts("Possible");
dfs(1,-1);
for(register int i=1;i<=m;++i){
if(!bian[i]){
puts("0");
}
else{
sc(w[bian[i]<<1]);
puts("");
}
}
return 0;
}