「網路流挖坑大全」最大流最小割 錯誤點記錄
阿新 • • 發佈:2018-12-27
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;
}