码迷,mamicode.com
首页 > 其他好文 > 详细

二分图判定

时间:2016-05-13 00:46:28      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

输入:V个顶点,E条边(无向)

输出:是不是二分图

example input :

3 3

0 1

1 2

0 2

〇--------①
 \    /
  \   /
   ②

给图上每个顶点着色,相邻顶点颜色不同


1、图的存储,使用vector数组

        G[s].push_back(t);
        G[t].push_back(s);
2、图的遍历,DFS,从一点出发,遍历该点所有的相邻点

 for(int j = 0 ; j < G[i].size();j++)//G[i][j]就是i的所有相邻点
3、着色判断

        if(v[G[i][j]]==color)return false;//如果已经着色错误
        if(v[G[i][j]]==0)//如果还没有着色
        {
            if(!dfs(G[i][j],-color))//那么给该点的所有相邻点着色
            return false;
        }

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int>G[1000005];
int v[10005];

bool dfs(int i,int color)
{
    v[i] = color;
    for(int j = 0 ; j < G[i].size();j++)
    {
        if(v[G[i][j]]==color)return false;
        if(v[G[i][j]]==0)
        {
            if(!dfs(G[i][j],-color))
            return false;
        }
    }
    return true;
}


int main()
{
    int V,E;
    scanf("%d %d",&V,&E);
    for(int i = 0 ; i < E;i++)
    {
        int s,t;
        scanf("%d %d",&s,&t);
        G[s].push_back(t);
        G[t].push_back(s);
    }
    int flag = 0;
    int color = 1;
    for(int i = 0 ; i < V;i++)
    {
        if(v[i]==0)
        {
            flag = dfs(i,color);
            color = (color==-1)?1:-1;
        }
        if(flag == 0)
            break;
    }
    if(flag == 0)
        cout<<"No"<<endl;
    else
        cout<<"Yes"<<endl;
}


二分图判定

标签:

原文地址:http://blog.csdn.net/wxyfennie/article/details/51346475

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!