2018年12月27日 天气:阴 心情:一般 because!——学网络流第二、三道题就WA,查错花了INF的时间
今天作为学习网络流的第二天,本人决定潜心研究记录网络流的错题
悼念我昨天的晚自修,没有去陪h^ovey——别打我!我错了!顺便补上昨天的错题
Ⅰ、炸点优化对象炸弄错了
[BJOI2006]狼抓兔子
WA Code:
int Dinic(int k,int flow)
{
if(k==T)
return flow;
int i,to,cap,res,rest=flow;
for(i=head[k];i&&rest;i=b[i].nxt)
{
to=b[i].to;cap=b[i].cap;
if(cap&&deep[to]==deep[k]+1)
{
res=Dinic(to,min(rest,cap));
if(!res)
deep[res]=0;//它错在这里!!!炸点炸的应该是to不是res!
b[i].cap-=res;
b[i^1].cap+=res;
rest-=res;
}
}
return flow-rest;
}
AC Code:
int Dinic(int k,int flow)
{
if(k==T)
return flow;
int i,to,cap,res,rest=flow;
for(i=head[k];i&&rest;i=b[i].nxt)
{
to=b[i].to;cap=b[i].cap;
if(cap&&deep[to]==deep[k]+1)
{
res=Dinic(to,min(rest,cap));
if(!res)
deep[to]=0;//就是这里!哼~不高兴!
b[i].cap-=res;
b[i^1].cap+=res;
rest-=res;
}
}
return flow-rest;
}
Ⅱ、建边没看方向 眼睛呢!
[BJOI2006]狼抓兔子
WA Code:
for(i=1;i<=n;i++)
for(j=1;j<m;j++)
{
cap=read();
add(TtO(i,j),TtO(i,j+1),cap);//这里!
}
for(i=1;i<n;i++)
for(j=1;j<=m;j++)
{
cap=read();
add(TtO(i,j),TtO(i+1,j),cap);//这里!!
}
for(i=1;i<n;i++)
for(j=1;j<m;j++)
{
cap=read();
add(TtO(i,j),TtO(i+1,j+1),cap);//还有这里!!!
}//别看了,我码量大~
AC Code:
for(i=1;i<=n;i++)
for(j=1;j<m;j++)
{
cap=read();
add(TtO(i,j),TtO(i,j+1),cap);
add(TtO(i,j+1),TtO(i,j),cap);//这样就对了
}
for(i=1;i<n;i++)
for(j=1;j<=m;j++)
{
cap=read();
add(TtO(i,j),TtO(i+1,j),cap);
add(TtO(i+1,j),TtO(i,j),cap);//嗯,就是这样
}
for(i=1;i<n;i++)
for(j=1;j<m;j++)
{
cap=read();
add(TtO(i,j),TtO(i+1,j+1),cap);
add(TtO(i+1,j+1),TtO(i,j),cap);//不错,这样很Nice
}
不过这位大佬想出了省一半空间的方法瑟瑟发抖
这个事情告诉我们:珍惜时间,好好看题
Ⅲ、边的方向弄错
[CQOI2009]跳舞
WA Code:
for(i=1;i<=(n<<1);i++)//偷懒而已……
{
add(i,i+(n<<1),n);
add(i,i+(n<<2),k);
}
AC Code:
for(i=1;i<=n;i++)
{
add(i,i+(n<<1),n);
add(i,i+(n<<2),k);
}
for(i=n+1;i<=(n<<1);i++)//反过来就对了!
{
add(i+(n<<1),i,n);
add(i+(n<<2),i,k);
}
这个事情告诉我们:年轻人切莫偷懒
Ⅳ、遍历边的时候写错
[CQOI2009]跳舞
WA Code:
int Dinic(int k,int flow)
{
if(k==T)
return flow;
int i,to,cap,res,rest=flow;
for(i=head[k];i&&rest;i=b[i].to)//厉害吧~
{
to=b[i].to;cap=b[i].cap;
if(cap&&deep[to]==deep[k]+1)
{
res=Dinic(to,min(rest,cap));
if(!res)
deep[to]=0;
b[i].cap-=res;
b[i^1].cap+=res;
rest-=res;
}
}
return flow-rest;
}
AC Code:
int Dinic(int k,int flow)
{
if(k==T)
return flow;
int i,to,cap,res,rest=flow;
for(i=head[k];i&&rest;i=b[i].nxt)//这样才对嘛!众人:智障!
{
to=b[i].to;cap=b[i].cap;
if(cap&&deep[to]==deep[k]+1)
{
res=Dinic(to,min(rest,cap));
if(!res)
deep[to]=0;
b[i].cap-=res;
b[i^1].cap+=res;
rest-=res;
}
}
return flow-rest;
}