1. 程式人生 > >求連通分量個數+判定二分圖

求連通分量個數+判定二分圖

今天做了一個錯誤的決定,學習新的知識,明天把生成樹的東西總結一下
//
深度優先遍歷框架 vector<int> G[maxn]; int vis[maxn]; void dfs(int u) { vis[u]=1; PREVISIT(u);//訪問節點u之前的操作 for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(!vis[v]) dfs(v); } POSITIVE(u);//訪問u之後的操作 } //計算出每個節點所屬的連通分量 void find_cc() { curent_cc
=0; memset(vis,0;sizeof(vis)); for(int i=0;i<n;i++) if(!vis[i]) { curent_cc++; dfs(i); } } //判定u所在的連通分量是否為二分圖 //二分圖的特點,每一條邊連線的兩個點屬於不同的集合,所以我們可以用黑白二色來代表 //兩個不同的集合,所以沿著一個節點搜尋它的相鄰節點,相鄰節點沒有被訪問,則染成它的相反色 //如果碰到了一個相鄰節點已經被訪問過,且其著的顏色相同的,則證明不是二分圖, int color[maxn]; bool f(int
u) { for(int i=0;i<G[u].size();i++) //遍歷i節點的所有子節點 { v=G[u][i]; if(color[v]==color[u]) return false;//如果遇到相同顏色,則不是二分圖,返回假 if(!color[v]) { color[v]=3-color[u];//未被訪問,染成相反顏色 if(!f(v))//如果從子節點v向下搜尋,遇到了兩個相鄰節點染同一色,則返回假 return false
; } } return true; }