zoukankan      html  css  js  c++  java
  • 【分解爪UVA11396-二分图染色模板】

    ·Rujia:“稍加推理即可解决该题……”

    ·英文题,述大意:

         一张无向连通图,每个点连有三条边。询问是否可以将这个图分成若干个爪子,并满足条件:①每条边只能属于一个爪子②每个点属于几个爪子无所谓。输出YES/NO。

    ·注意一个关键条件:“每条边只能属于一个爪子”:

    image

    ·注意一个逻辑顺序:

    如果我们这样想,就很吃力:如何寻找一种划分方案,将原图划分为若干个爪子,如果无法划分,则输出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

    此刻我站在窗前望着外面,车辆穿梭高楼闪烁,
    伴着晶莹的小雨和那歌声,我轻轻哼起这首歌。-------汪峰《生来孤独》

  • 相关阅读:
    常见的排序算法--java版
    使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
    在JAVA中如何跳出当前的多重嵌套循环
    说说&和&&的区别
    家族/亲戚(relation)
    面积(area)
    珍珠(bead)
    N皇后问题
    纪念品分组 2007年NOIP全国联赛普及组
    二叉树的序遍历
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/6979646.html
Copyright © 2011-2022 走看看