Codeforces Gym 100199 B Reactor Cooling
对于每条边
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int s=205,t=206,oo=0x3f3f3f3f;
int fir[210],ne[100010],to[100010],w[100010],ws[210],wt[210],low[100010],up[100010],que[210],dep[210],n,m,num;
void add(int u,int v,int x)
{
num++;
ne[num*2]=fir[u];
fir[u]=num*2;
to[num*2]=v;
w[num*2]=x;
ne[num*2+1]=fir[v];
fir[v]=num*2+1;
to[num*2+1]=u;
w[num*2+1]=0;
}
bool bfs()
{
int hd=1,tl=1,u,v;
que[1]=s;
memset(dep,0,sizeof(dep));
dep[s]=1;
while (hd<=tl)
{
u=que[hd++];
for (int i=fir[u];i;i=ne[i])
if (w[i]&&!dep[v=to[i]])
{
dep[v]=dep[u]+1;
que[++tl]=v;
}
}
return dep[t];
}
int dfs(int u,int lim)
{
int v,ret=0,x;
if (u==t) return lim;
for (int i=fir[u];i&&ret<lim;i=ne[i])
if (w[i]&&dep[v=to[i]]==dep[u]+1)
{
x=dfs(v,min(w[i],lim-ret));
ret+=x;
w[i]-=x;
w[i^1]+=x;
}
if (!ret) dep[u]=0;
return ret;
}
void check()
{
for (int i=1;i<=t;i++)
for (int j=fir[i];j;j=ne[j])
if (w[j]) printf("%d:%d->%d:%dn",i,to[j],w[j]);
}
int main()
{
freopen("cooling.in","r",stdin);
freopen("cooling.out","w",stdout);
int u,v,sum=0,ans=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&u,&v,&low[i],&up[i]);
ws[v]+=low[i];
wt[u]+=low[i];
sum+=low[i];
add(u,up[i]-low[i]);
}
for (int i=1;i<=n;i++)
{
add(s,ws[i]);
add(i,t,wt[i]);
}
//check();
while (bfs()) ans+=dfs(s,oo);
//check();
if (ans==sum)
{
printf("YESn");
for (int i=1;i<=m;i++) printf("%dn",up[i]-w[i*2]);
}
else printf("NOn");
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |