uva11396 dfs应用

本文探讨了一种用于判断特定三度图是否能分解为爪形图的方法,并将其转化为二分图判定问题,通过算法实现图的分解与验证。

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

题意:判断一个三度图(每个点的度均为3)是否可以分解成若干个爪形,每条边恰属于一个爪。

思路:每个爪型的中心点标记为1,边缘点标记为1,可知每条边恰属于一个爪<=>每条边的两端点不同时为0或1<=>该图是二分图,转化为二分图判定问题


#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#define maxn 400
#define maxm 300000
#define INF 1<<28
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

vector<int> g[maxn];
int n,color[maxn];

bool bi(int u){
    for(int i=0;i<g[u].size();i++){
        if(!color[g[u][i]]){
            color[g[u][i]]=3-color[u];
            if(!bi(g[u][i])) return false;
        }
        else if(color[g[u][i]]==color[u]) return false;
    }
    return true;
}

bool judge_bi(){
    for(int i=1;i<=n;i++) if(!color[i]) { color[i]=1; if(!bi(i)) return false; }
    return true;
}

int main(){
    //freopen("a.txt","r",stdin);
    while(scanf("%d",&n)!=EOF){
        if(!n) break;
        mem(color,0);
        for(int i=1;i<=n;i++) g[i].clear();
        int u,v;
        while(scanf("%d%d",&u,&v),u&&v) { g[u].push_back(v),g[v].push_back(u); }
        if(judge_bi()) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值