1. 程式人生 > >NOIP模擬 水管(水題)

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;
}