NOIP--判断二分图——染色法

    • 怎么判定一个图是否为二分图 
      从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图,每次用bfs遍历即可。

    • 代码:

    • #include <queue>

    •  #include <cstring>

    •  #include <iostream>

    •  using namespace std;

    •  const int N = 999;

    •  int col[N], Map[N][N];  //0为白色,1为黑色  

    • bool BFS(int s, int n) {  

    •    queue<int> p;      

    • p.push(s);      

    • col[s] = 1;  //将搜索起始点涂成黑色    

    • while(!p.empty())    

    • {        

    •  int from = p.front();        

    •  p.pop();        

    •  for(int i = 1; i <= n; i++)      

    •  {            

    •  if(Map[from][i] && col[i] == -1) //如果从from到i的边存在(为邻接点) && i点未着色          

    •  {                

    •  p.push(i);          //将i点加入队列              

    •  col[i] = !col[from];//将i点染成不同的颜色            

    •  }            

    •  if(Map[from][i] && col[from] == col[i])//如果从from到i的边存在(为邻接点) && i点和from点这一对邻接点颜色相同,则不是二分图                

    •  return false;        

    •  }    

    •  }    

    •  return true;  //搜索完s点和所有点的关系,并将邻接点着色,且邻接点未发现相同色则返回true    

    • }  

    • int main() {      

    • int n, m, a, b;      

    • memset(col, -1, sizeof(col));    

    •  cin >> n >> m;  //n 为有多少点,m为有多少边    

    •  for(int i = 0; i < m; i++)    {        

    •  cin >> a >> b;        

    •  Map[a][b] = Map[b][a] = 1;    

    •  }      

    • bool flag = false;  

    • for(i = 1; i <= n; i++)  //遍历并搜索各个连通分支  

    •  {          

    •  if(col[i] == -1 && !BFS(i, n)) //每次找没有着色的点进行判断,如果从它开始BFS发现相同色邻接点则不是二分图      

    •  {            

    •  flag = true;              

    • break;            

    • }    

    •  }  

    •  if(flag)        

    •  cout << "NO" <<endl;        

    •  else        

    •  cout << "YES" <<endl;    

    •  return 0;  

    •  

      • NOIP信息学视频地址

        视频地址

        链接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw 
        提取码:7jgr

posted @ 2020-10-29 12:59  tianli3151  阅读(107)  评论(0编辑  收藏  举报