首页 > 其他 > 详细

洛谷-P2661 信息传递——有向图中的最小环

时间:2019-09-06 23:53:47      阅读:162      评论:0      收藏:0      [点我收藏+]

题意

给定一个 $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\n", ans);
    return 0;
}

 

 

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

洛谷-P2661 信息传递——有向图中的最小环

原文:https://www.cnblogs.com/lfri/p/11478460.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!