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