NOIP模擬 水管(水題)
阿新 • • 發佈:2018-11-11
傳送門
【題目分析】
為什麼打了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; }