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

 

posted @ 2018-11-08 14:26  Ishtar~  阅读(187)  评论(0编辑  收藏  举报