分解爪UVA11396-二分图染色模板
Posted 大米饼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分解爪UVA11396-二分图染色模板相关的知识,希望对你有一定的参考价值。
·Rujia:“稍加推理即可解决该题……”
·英文题,述大意:
一张无向连通图,每个点连有三条边。询问是否可以将这个图分成若干个爪子,并满足条件:①每条边只能属于一个爪子②每个点属于几个爪子无所谓。输出YES/NO。
·注意一个关键条件:“每条边只能属于一个爪子”:
·注意一个逻辑顺序:
如果我们这样想,就很吃力:如何寻找一种划分方案,将原图划分为若干个爪子,如果无法划分,则输出NO。
所以换一下口味:只要这个图能够合法染色,那么必定存在一种分配情况使得这个图被分成若干个爪子。
·以此同时:题目中“每个点有三条边”使得这道题只需要对任意一个点判定一次染色就行了。
1 #include<stdio.h>
2 #include<cstring>
3 #define go(i,a,b) for(int i=a;i<=b;i++)
4 #define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
5 #define mem(a,b) memset(a,b,sizeof(a))
6 using namespace std;const int N=500;
7 struct E{int v,next;}e[N*N];int n,k,head[N],color[N];
8 void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
9 bool Dye(int u){fo(i,head,u)
10 {
11 if(color[u]==color[v])return 0;
12 if(!color[v]){color[v]=3-color[u];if(!Dye(v))return 0;}}return 1;
13 }
14 int main(){while(scanf("%d",&n)&&n)
15 {
16 k=1;mem(head,0);int u,v;
17 while(scanf("%d%d",&u,&v)&&u&&v)ADD(u,v),ADD(v,u);
18 mem(color,0);color[1]=1;puts(Dye(1)?"YES":"NO");
19 }return 0;}//Paul_Guderian
此刻我站在窗前望着外面,车辆穿梭高楼闪烁,
伴着晶莹的小雨和那歌声,我轻轻哼起这首歌。-------汪峰《生来孤独》
以上是关于分解爪UVA11396-二分图染色模板的主要内容,如果未能解决你的问题,请参考以下文章
uva 11396Claw Decomposotion(二分图判定)
UVA11080 - Place the Guards (二分图染色)