混合图欧拉回路

算法问题描述

给定一个混合图,问是否存在一条欧拉回路

网络流

算法思想

混合图的欧拉回路涉及到无向边该往哪个方向选的问题,我们不妨先让无向边随意指向一个方向,并从u到v连1的边。
判断每个点的出度和入度(包括随机的无向边),如果出度已经等于入度了就不管它,如果有差值,对于每个点i记dw为出度-入度。dw>0则S到i连dw/2的边,dw<0则i到T连-dw/2的边,如果最大流能跑满则是欧拉回路,否则不是。

正确性

一个有向图是欧拉回路的充要条件是每个点出度等于入度
如果一个无向边决定翻转,那么它的起点和终点出入度的差值都会改变2,我们就在图里面连上容量1的边,出入度不等的点我们把它按情况和源汇点连dw/2的边,本质上是在重新分配那些无向边,如果无向边通过一些翻转(无向边有流量经过)使得出入度的差值被磨平(图被填满),则存在欧拉回路

代码
bool check(){
    int sum=0;
    memset(head,-1,sizeof head);
    memset(ind,0,sizeof ind);
    memset(oud,0,sizeof oud);
    for(int i=1;i<=m;i++){
        int u=p[i].u,v=p[i].v,a=p[i].a,b=p[i].b;
        if(a && b){
            oud[u]++;
            ind[v]++;
            ins(u,v,1);
        }
        else if(a){
            oud[u]++;
            ind[v]++;
        }
        else if(b){
            ind[u]++;
            oud[v]++;
        }
        else return 0;
    }
    for(int i=1;i<=n;i++){
        int dw=oud[i]-ind[i];
        if(dw&1) return 0;
        if(dw>0) sum+=dw,ins(S,i,dw/2);
        else ins(i,T,-dw/2);
    }
    return Dinic(S,T)==sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jarden_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值