• 【分解爪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

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

  • 相关阅读:
    CAN总线学习资料
    VMware虚拟机 硬盘空间不足 磁盘大小调整方案
    郭天祥-S3C2440开发板Linux2.6.31移植教程
    MFC串口编程——使用标准SerialCom类
    Luogu P2602 [ZJOI2010]数字计数 //数位DP
    luogu P1896 [SCOI2005] 互不侵犯 //状压DP
    中北大学ACM 5/12 T6 CSY的幸福
    P2473 || SCOI2008 奖励关 //状压&&期望DP
    请让蝴蝶爬满全身
    【图论】二分图 // 未完成 =、=
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/6979646.html
Copyright © 2020-2023  润新知