[DFS]JZOJ 5916 flow
分析
(这次题面很危险啊)
随便DFS搞个生成树,ai之和即为要输送的水量什么的,然后因为双向边通过编号奇偶判断一下正负即可
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const int N=2e5+10; struct Edge { int u,v,nx; }g[N*3]; int cnt,list[N]; ll w[N],f[N+N/2],sum; bool vis[N]; int n,m; void Add(int u,int v) { g[++cnt].u=u;g[cnt].v=v;g[cnt].nx=list[u];list[u]=cnt; } void Dfs(int u) { vis[u]=1; for (int i=list[u];i;i=g[i].nx) if (!vis[g[i].v]) { Dfs(g[i].v); w[u]+=w[g[i].v]; f[i+1>>1]=(i&1?-1:1)*w[g[i].v]; } } int main() { freopen("flow.in","r",stdin); freopen("flow.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld",&w[i]),w[i]=-w[i],sum+=w[i]; if (sum) { printf("Impossible\n"); return 0; } scanf("%d",&m); for (int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); Add(u,v);Add(v,u); } Dfs(1); printf("Possible\n"); for (int i=1;i<=m;i++) printf("%lld\n",f[i]); }
在日渐沉没的世界里,我发现了你。