圖的遍歷(染色法判斷奇環)

圖的遍歷(染色法判斷奇環)

傳送門

思路:首先圖應該爲連通圖,所需要加的邊數即addedge=add_{edge}=連通塊數1-1

然後又因爲是要每次走兩步,即最後要走偶數步即對於走一個奇環。因爲奇數條邊的環倒退一步就是偶數步。判斷是否有奇環用二分圖的染色法即可。

如果沒有奇環則+1+1條邊即可。

時間複雜度:O(n+m)O(n+m)

AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define mst(a) memset(a,0,sizeof a)
vector<int>e[N];
int n,m,col[N],ans,ok=1;
void dfs(int u){
     for(auto v:e[u]){
         if(!col[v]){  //染色法
             col[v]=-col[u];
             dfs(v);
         }
         else if(col[v]==col[u]) ok=0; //判斷是否有奇環
     }
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v);
        e[u].push_back(v),e[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        if(!col[i]){
            ans++; //連通塊數
            col[i]=1;
            dfs(i);
        }
    }
    printf("%d\n",ans-1+ok);
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章