• Codeforces 659E 找环+(并查集/dfs)


    题目:
    http://codeforces.com/problemset/problem/659/E
    题意:
    给你一个图,现在要你给这个图里面的边定方向,使得入度为0的点最少。
    分析:
    对于一个连通块而言,如果里面存在一个环,那么必然所有点的入度都可以大于等于1
    否则的话,就存在一个点的入度为0。

    并查集:

    #include <bits/stdc++.h>
    using namespace std;
    int n, m, u, v, fa[100005], a[100005];
    int findfa(int x){return fa[x] == x? x : fa[x] = findfa(fa[x]);}
    int main()
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) fa[i] = i, a[i] =0;
        for (int i = 1; i <= m; i++)
        {
            scanf("%d%d", &u, &v);
            u = findfa(u), v = findfa(v);
            if (u == v) a[u]++; //有环,标记一下
            else
                fa[u] = v,a[v]+=a[u];
        }
        int ans = 0;
        for (int i = 1; i <= n; i++)
        {
            if (findfa(i) == i) ans += a[i]==0? 1 : 0;
        }
        printf("%d
    ", ans);
        return 0;
    }

    看到网上的题解大多数是dfs,这也更好理解:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    vector<int>a[N];
    int flag;
    bool vis[N];
    void dfs(int u,int pre)
    {
        if(vis[u]){
            flag=0;
            return;
        }
        vis[u]=1;
        for(int i=0;i<a[u].size();i++){
            if(a[u][i]!=pre){
                dfs(a[u][i],u);
            }
        }
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int x,y;
        for(int i=0;i<m;i++){
            scanf("%d%d",&x,&y);
            a[x].push_back(y);
            a[y].push_back(x);
    
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                flag=1;
                dfs(i,-1);
                ans+=flag;
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    根据当前日期转目的国地区时间戳
    时间戳转换作用域问题
    字符串拼接问题
    input全选和取消全选
    循环遍历渲染模块
    jQuery实现获取选中复选框的值
    React组件
    underscore.js依赖库函数分析二(查找)
    underscore.js依赖库函数分析一(遍历)
    React入门
  • 原文地址:https://www.cnblogs.com/01world/p/5651238.html
Copyright © 2020-2023  润新知