uva11396 dfs应用

来源:互联网 发布:中国移动有什么软件 编辑:程序博客网 时间:2024/06/16 01:47

题意:判断一个三度图(每个点的度均为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;}


0 0
原创粉丝点击