zoukankan      html  css  js  c++  java
  • Uva 10004(二分图的判定)

    这题其实很简单的说,第一次用邻接表来存图= =

    首先图的储存结构是结构体+head数组。。。其实head数组保存的

    struct node
    {
        int v;
        int next;
    }V[200*200];


     假设现在有u节点,v表示的是和他邻接的点,next保存的是v对应的编号,head数组保存的是链表的头节点编号。

    比如有

    1 2

    1 3

    1 4的点边关系那么V[head[1]].v=4;V[head[2]].v=1,V[head[3]].v=1;

    现在讲讲如何判断图是不是二分图,首先对任意没染色的点进行染色,之后判断与其相邻的点若是没染色则染上与其相邻的顶点不同的颜色,若是染过色且与相邻的顶点颜色相同则不是二分图==

    判断的过程用dfs来实现

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node
    {
        int v;
        int next;
    }V[200*200];
    int tol; 
    int head[200];
    int col[200];
    void init()
    {
        int tol=0;
        memset(head,-1,sizeof(head));
    }
    void add(int u,int v)
    {
        V[tol].v=v;
        V[tol].next=head[u];
        head[u]=tol++;
    }
    bool bldfs(int u,int co)
    {
        int i,v;
        col[u]=co;
        for(i=head[u];i!=-1;i=V[i].next)
        {
            v=V[i].v;
            if(col[v]==co)
            return false;
            if(col[v]==-1&&!bldfs(v,co^1))
            return false;
        }
        return true;
    }
    int main()
    {
        int n,m;
        while(scanf("%d",&n)!=EOF&&n)
        {
            init();
            int u,v;
            scanf("%d",&m);
            for(int i=0;i<m;i++)
            {
                scanf("%d %d",&u,&v);
                add(u,v);
                add(v,u);
            }
            memset(col,-1,sizeof(col));
            int flag=0;
            for(int i=0;i<n;i++)
            {
                if(col[i]==-1)
                if(!bldfs(i,0))
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
            printf("NOT BICOLORABLE.
    ");
            else
            printf("BICOLORABLE.
    ");
        }
        return 0;
    }
  • 相关阅读:
    ios swift模仿qq登陆界面,xml布局
    类和结构体的区别
    获取或者设置时,无后缀和A后缀和W后缀的区别
    mfc控件学习
    MFC之简单计算器
    双冒号、点操作、箭头的区别
    MFC使用MsComm做串口通信
    保存结构体到本地(二进制)
    文件管理函数
    文件定位的几个函数
  • 原文地址:https://www.cnblogs.com/NaCl/p/4796279.html
Copyright © 2011-2022 走看看