「网络流挖坑大全」最大流最小割 错误点记录

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

猜你喜欢

转载自www.cnblogs.com/hovny/p/10183114.html