1. 程式人生 > >「網路流挖坑大全」最大流最小割 錯誤點記錄

「網路流挖坑大全」最大流最小割 錯誤點記錄

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;
}