http://codeforces.com/problemset/problem/977/E
解题思路:
1.这里的环是没有任何多余的边的环,无自环,即环内所有点的度严格等于2
2.DFS一个一个地找出图,DFS搜索时标记已搜的点,避免重复搜索
3.对找到的每个图进行check,看是否图内所有点的度严格等于2,是就成环,不是就非环
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000+10;
bool visited[maxn];
vector<int> G[maxn];
vector<int> di;
void dfs(int tag){
visited[tag] = true;
di.push_back(tag);
for(int i=0;i<G[tag].size();i++)
if(visited[G[tag][i]] == false)
dfs(G[tag][i]);
}
int main(){
ios::sync_with_stdio(false);
int n,m,u,v,j,cnt = 0;
cin >> n >> m;
for(int i=0;i<m;i++) {
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++){
if(visited[i] == true)
continue;
di.clear();
dfs(i);
for(j=0;j<di.size();j++)
if(G[di[j]].size() != 2)
break;
if(j == di.size())
cnt++;
}
cout << cnt << endl;
return 0;
}
import java.util.*;
public class Main {
static Vector[] v = new Vector[200010];
static boolean book[] = new boolean[200010];
static void dfs(int r) {
v[0].add(r);
book[r] = true;
for(int i = 0;i < v[r].size();i++) {
if(book[(int) v[r].get(i)] == false)
dfs((Integer) v[r].get(i));
}
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(),m = sc.nextInt();
for(int i = 0;i <= n;i++) { //初始化
v[i] = new Vector<Integer>();
book[i] = false;
}
for(int i = 1;i <= m;i++) {
int l = sc.nextInt(),r = sc.nextInt();
v[l].add(r); //用邻接矩阵存图
v[r].add(l);
}
int ans = 0;
for(int i = 1;i <= n;i++) {
if(book[i] == true)
continue;
v[0].clear(); //目标数组清空
dfs(i); //参数是搜索下标
int j;
for(j = 0;j < v[0].size();j++) {
if(v[(int) v[0].get(j)].size() != 2) {
break;
}
}
if(j == v[0].size()) //如果目标数组所有点的度都为2,表示有一个环
ans++;
}
System.out.println(ans);
}
}