UVA 11396 Claw Decomposition(二分图判断)

本文介绍了一种通过判断图是否为爪图中心来识别二分图的方法,并提供了详细的算法实现过程。当一个节点作为爪图的中心时,它仅能与其它三个辅助点相连,据此可以构建一张二分图并进行颜色标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果一个节点是一个爪的中心,那么他只能与其余三个辅助点相连,那么就可以发现这是一张二分图,X为爪的中心,Y为三个脚,建完图染下色就可以了。
Claw Decomposition 
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=300+5;
int head[maxn*maxn],to[maxn*maxn],Next[maxn*maxn];
int color[maxn];
int n,m;
int tot;
void addedge(int u,int v)
{
    to[tot]=v;
    Next[tot]=head[u];
    head[u]=tot++;
}
bool getc(int u)
{
    for(int i=head[u];i!=-1;i=Next[i])
    {
        int v=to[i];
        if(color[v]==-1){
            color[v]=3-color[u];
            if(!getc(v)) return false;
        }
        else if(color[u]==color[v]) return false;
    }
    return true;
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        m=0;tot=0;
        memset(head,-1,sizeof(head));
        int u,v;
        while(scanf("%d%d",&u,&v)&&(u+v)){
            m++;
            addedge(u,v);
            addedge(v,u);
        }
        if(3*n!=2*m) {printf("NO\n");continue;}
        bool ok=true;
        memset(color,-1,sizeof(color));
        for(int i=1;i<=n;i++){
            if(color[i]==-1){
                color[i]=1;
                ok=getc(i);
                if(ok==false) break;
            }
        }
        if(ok) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值