UVA 11396

Posted TSOI_Vergil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 11396相关的知识,希望对你有一定的参考价值。

    这道题看的我一头雾水,看了题解以后理解了半天,我们考虑对于每个点来说,要么它是中心节点,要么它是边缘节点,它不可能既是一个中心节点又是一个边缘节点,因为每个点的度数均为3,如果它是边缘节点,那它已经有一条边连向了中心节点,只剩两条边,不可能再作为中心节点,那多余的边怎么办呢?只能留给其他的中心节点去连,这样的话我们发现每一条边都是连接了中心节点和边缘节点,那如果能爪分解那它一定是二分图,由于题目保证每个点度数是3,那么如果这个图是一个二分图的话,我们一定可以从中心节点的集合里构造出每个爪,这样我们就只需要进行二分图判断。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 305
#define maxm 200000
int pre[maxm],last[maxn],other[maxm];
int n,m,l,col[maxn];

void connect(int x,int y)

	l++;
	pre[l]=last[x];
	last[x]=l;
	other[l]=y;	


bool dfs(int u)

	for (int p=last[u];p;p=pre[p]) 
	
		int v=other[p];
		if (col[v]==0) 
		
			col[v]=3-col[u];
			return dfs(v);
		
		else if (col[v]==col[u]) return 0;
	
	return 1;


int main()

	while (1)
	
		scanf("%d",&n);
		if (n==0) break;
		memset(last,0,sizeof last);
		memset(col,0,sizeof col);
		while (1) 
		
			int a,b;
			scanf("%d%d",&a,&b);
			if (a==0) break;
			connect(a,b);
			connect(b,a);	
		
		col[1]=1;
		if (dfs(1)) printf("YES\\n");else printf("NO\\n"); 
	
	return 0;	


以上是关于UVA 11396的主要内容,如果未能解决你的问题,请参考以下文章

分解爪UVA11396-二分图染色模板

uva 11396Claw Decomposotion(二分图判定)

uva1613 K-Graph Oddity

UVA 10972 - RevolC FaeLoN(边-双连通分量)

UVA11387 - The 3-Regular Graph(推理)

UVA 12035 War Map