zoukankan      html  css  js  c++  java
  • 染色法判断二分图

    二分图:不存在奇数环也就是相邻两个点颜色不同就是二分图

    给定一个n个点m条边的无向图,图中可能存在重边和自环。

    请你判断这个图是否是二分图。

    输入格式

    第一行包含两个整数n和m。

    接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。

    输出格式

    如果给定图是二分图,则输出“Yes”,否则输出“No”。

    数据范围

    1n,m1051≤n,m≤105

    输入样例:

    4 4
    1 3
    1 4
    2 3
    2 4
    

    输出样例:

    Yes

    ##############################################################

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int N = 1e5+10, M = 2*1e5+10;
     5 int h[N], e[M], ne[M], idx;
     6 int color[N];//0 无色 1 2 各代表一种color
     7 int n, m;
     8 
     9 void add(int a, int b){
    10     e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
    11 }
    12 
    13 bool dfs(int u, int c){
    14     color[u] = c;
    15     for(int i = h[u];i != -1;i = ne[i]){
    16         int t = e[i];
    17         if(color[t] == c) return false;//染过但是和上一次染色同色
    18         if(!color[t] && !dfs(t, 3 - c)) return false;
    19     }
    20     return true;//是二分图
    21 }
    22 
    23 int main(){
    24     memset(h, -1, sizeof h);
    25     scanf("%d%d",&n, &m);
    26     while(m--){
    27         int a, b;
    28         cin >> a >> b;
    29         add(a, b); add(b, a);
    30     }
    31     bool flag = true;//代表不存在奇数环,也就是说这是一个二分图
    32     for(int i = 1;i <= n;++i){
    33         if(!color[i]){
    34             if(!dfs(i, 1)){
    35                 flag = false;
    36                 break;
    37             }
    38         }
    39     }
    40     if(flag) cout << "Yes" << endl;
    41     else cout << "No" << endl;
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    双系统卸载linux和装双系统的方法
    linux中使用vim编译C++程序
    存储器管理之页面置换算法
    Python中open文件的各种打开模式
    RAL调用
    分布式系统事务一致性解决方案
    消息队列设计
    nmq消息队列解析
    分布式session的实现
    分布式系统常用思想和技术总结 (入门很清楚)
  • 原文地址:https://www.cnblogs.com/sxq-study/p/12238305.html
Copyright © 2011-2022 走看看