zoukankan      html  css  js  c++  java
  • 洛谷-P2661 信息传递——有向图中的最小环

    题意

    给定一个 $n$ 个结点有向图,求其中最小环的大小。($n leq 200000$).

    分析

    由于每条点出度都为1且满足传递性,可以用并查集做。

    如果有一条从x到y的有向边,那么y就是x的父亲。如果x,y在同一集合,说明x,y都在环上。还需维护每个结点到根节点的距离。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 200000 + 10;
    int fa[maxn], dis[maxn];  //fa父节点
    int n, ans;
    
    //初始化n个节点
    void init(int n)
    {
        for (int i = 0; i <= n; i++)
            fa[i] = i;
    }
    
    //查询树的根
    int find(int x)
    {
        if (x == fa[x])  return fa[x];
        int father = fa[x];
        fa[x] = find(fa[x]);  //先递归更新dis 
        dis[x] += dis[father];
        return fa[x];
    }
    
    //合并x和y所属的集合
    void unite(int x, int y)   //x-->y
    {
        int rx = find(x);
        int ry = find(y);
        if (rx == ry)
        {
            ans = min(ans, dis[x]+dis[y]+1);
        }
        else
        {
            fa[rx] = ry;
            dis[x] = dis[y] + 1;
        }
    }
    
    int main()
    {
        scanf("%d", &n);
        init(n);
        ans = maxn+1;
        for(int i = 1;i <= n;i++)
        {
            int u;
            scanf("%d", &u);
            unite(i, u);
        }
        printf("%d
    ", ans);
        return 0;
    }

    参考链接:https://www.cnblogs.com/wyboooo/p/11057090.html

  • 相关阅读:
    天网管理系统
    NSCTF web200
    程序逻辑问题
    Once More
    Guess Next Session
    上传绕过
    加了料的报错注入
    C++ GET UTF-8网页编码转换
    Android学习笔记函数
    C++ 模拟虚拟键盘按键表
  • 原文地址:https://www.cnblogs.com/lfri/p/11478460.html
Copyright © 2011-2022 走看看