codeforces 解题报告 977E. Cyclic Components graphs DFS

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);
    }
}


猜你喜欢

转载自blog.csdn.net/a912952381/article/details/81056505