本文共 777 字,大约阅读时间需要 2 分钟。
n个点m条边的无向图,问有几个环,这个环上的点必须只有一个前驱和一个后继。
1.第1次dfs把度数不是2的点所在连通块上的点全部标记。
2.第2次dfs计算所有未标记的点的连通块数,有几个连通块就是几个环。
#include#define N 200005#define mod 998244353using namespace std ;int n , m ;vector edge[N] ;bool vis[N] ;void dfs(int u){ int v ; int i , j ; vis[u] = 1 ; for(i = 0 ; i < edge[u].size() ; i ++) { v = edge[u][i] ; if(!vis[v]) dfs(v) ; }}int main(){ int i , j ; int u , v ; int num = 0 ; scanf("%d%d" , &n , &m) ; for(i = 0 ; i < m ; i ++) { scanf("%d%d" , &u , &v) ; edge[u].push_back(v) ; edge[v].push_back(u) ; } memset(vis , 0 , sizeof(vis)) ; for(i = 1 ; i <= n ; i ++) if(!vis[i] && edge[i].size() != 2) dfs(i) ; for(i = 1 ; i <= n ; i ++) { if(!vis[i]) { dfs(i) ; num ++ ; } } printf("%d" , num) ;}
转载地址:http://npml.baihongyu.com/