最大流,最小割刷题记录

T1 P2057 [SHOI2007] 善意的投票

题目

https://www.luogu.com.cn/blog/OnMyOwn/OnMyOwn

https://www.luogu.com.cn/problem/P2057

题目: 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。每位小朋友应该怎样投票,才能使冲突数最小?

断点概述:

1,最小割建模困难,没有想到
2,对组合的处理欠思考,

思想概述:

code

T2 P2857 [USACO 06FEB ]Steady Cow Assignment G

题目

https://www.luogu.com.cn/problem/P2857

https://www.luogu.com.cn/blog/387840/solution-p3033

给出 N条 平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段。
输入:(x1,y1,x2,y2)

断点概述:

1,建模在割,试图对所有点进行分类
2,读题不细,对同方向交点进行了讨论
3,输入坐标不保证顺序,需要满足我们的(不妨设)

思想概述:

1,二分图,一个方向一个,任意线段有交点就建边
2,求得最小割,删去这些匹配,也就是在这些有交点的线段中删去其一,即可分成两个独立集合
3,按照顺序类别枚举边,使得判断函数简单

code

int main()
{
    Mset(h,-1);
    read(n);
    rep(i,1,n)
    {
        int x1,x2,y1,y2;
        read(x1);read(y1); read(x2); read(y2);
        if(x1==x2)
        {
            if(y1>=y2)swap(y1,y2);
            px[++cx]={x1,y1,x2,y2};
        }

        else
        {
            if(x1>=x2)swap(x1,x2);
            py[++cy]={x1,y1,x2,y2};
        }
    }

    S = N -1;
    T = N -2;

    rep(i,1,cx)
    {
        rep(j,1,cy)
        {
            if(check(px[i],py[j]))add(i,cx+j,1);
        }
    }

    rep(i,1,cx)add(S,i,1);
    rep(i,1,cy)add(i+cx,T,1);
    wri(n-Dinic());
    return 0;
}

T2 P1231 教辅的组成

https://www.luogu.com.cn/problem/P1231

https://siyuan.blog.luogu.org/solution-p1231

题目:三分图匹配
断点概述:

1,三分图建模完成
2,中间节点流量限制没想到(限制在边上)
3,编号思维速度慢

code

int main()
{
    Mset(h,-1);
    /// 书   1 - n
    /// 书出 n+1 - n+n
    /// 练习 2*n+1 - 2*n+m
    /// 答案 2*n+m+1 - 2*n+m+k

    read(n); read(m); read(k);
    int cnt;
    S = N-1;
    T = N-2;

    read(cnt);
    rep(i,1,cnt)
    {
        int x,y;
        read(x); read(y);
        add(2*n+y,x,1);
    }

    rep(i,1,n)add(i,i+n,1);

    read(cnt);
    rep(i,1,cnt)
    {
        int x,y;
        read(x); read(y);
        add(x+n,2*n+y+m,1);
    }

    rep(i,1,m) add(S,i+2*n,1);
    rep(i,1,k) add(i+2*n+m,T,1);

    wri(Dinic());
}

断点概述:

int sol()
{
    int ans= 0;
    queue<int>q;
    q.push(S);
    Mset(st,0);
    while (q.size())
    {
        int top = q.front(); q.pop();
        for(int i=h[top];~i;i=ne[i])
        {
            if(i%2==0 && f[i])
            {
                int v=e[i];
                if(!st[v])st[v]=1,q.push(v);
            }
        }
    }

    q.push(T);
    while(q.size())
    {
        int top = q.front(); q.pop();
        for(int i=h[top];~i;i=ne[i])
        {
            if(i%2)
            {
                int v=e[i];
                //if(!st[v])st[v]=1,q.push(v);
                .....
            }
        }
    }
}

T1

  • 求解割点,限制上点,联通性边连成INF
  • 思考限制在点

https://www.luogu.com.cn/problem/P1345

int main()
{
    Mset(h,-1);
    read(n); read(m); read(S); read(T);
    rep(i,1,n)
    {
        if(i==S||i==T) add(i,i+n,INF);
        else add(i,i+n,1);
    }

    while (m--)
    {
        int a,b,c;
        read(a); read(b);
        add(b+n,a,INF);
        add(a+n,b,INF);
    }
    
    int ans = Dinic();
    cout<<ans;
}

T2

网络流定义,每次走最大流,性质开到ceil

int main()
{
    Mset(h,-1);
    read(n); read(m); read(k);
    S = 1 ;
    T = n ;

    while (m--)
    {
        int a,b,c;
        read(a); read(b); read(c);
        add(a,b,c);
        //add(b,a,c);
    }
    int ans = Dinic();
    if(ans)cout<<ans<<" "<<(int)ceil((double)k/ans);
    else puts("Orz Ni Jinan Saint Cow!");
}

T3

https://www.luogu.com.cn/problem/P2071

二分图最大匹配

{
    Mset(h,-1);
    read(n);
    S = 0;
    T = N-1;

    rep(i,1,2*n)
    {
        int x,y;
        read(x); read(y);
        add(S,i,1);
        add(i+2*n,T,2);
        add(i,x+2*n,1);
        add(i,y+2*n,1);
    }

    int ans = Dinic();
    cout<<ans;
}

T3

https://www.luogu.com.cn/problem/P2740

网络流可以处理正环和重复建边

int main()
{
    Mset(h,-1);
    read(m); read(n);
    S = 1; T = n;
    rep(i,1,m)
    {
        int x,y,z;
        read(x); read(y); read(z);
        add(x,y,z);
    }

    int ans = Dinic();
    cout<<ans;
}

错误分析

int main()
{
    int will[N];
    Mset(h,-1);
    read(n); read(m);
    S = N -1 ; /// 表示0
    T = N-2 ; /// 表示1
    rep(i,1,n)
    {
        int x; read(x);
        will[i]=x;
        if(x)add(S,i,1), add(i,T,0);
        else add(S,i,0), add(i,T,1);
    }

    rep(i,1,m)
    {
        int a,b;
        read(a); read(b);
        add(S,n+i*2,(will[a]==1) + (will[b]==1) );
        add(n+i*2-1,T,(will[a]==0) + (will[a]==0) );
        add(n+i*2,a,INF);
        add(n+i*2,b,INF);
        add(a,n+i*2-1,INF);
        add(b,n+i*2-1,INF);
    }
    wri(Dinic());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流苏贺风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值