洛谷 U85165 传播八卦

洛谷 U85165 传播八卦

题目传送门

题目背景

由于过于频繁地和女朋友幽会(有一次还就在机房附近,实在是太过分了!),\(Seaway\)谈恋爱的事情被同学们发现了!与之相关的八卦火速在学校传开......

题目描述

现在一共有\(N\)(编号\(1-N\))个人知道\(Seaway\)谈恋爱。但是,每个人都只知道片面的信息,所以他(她)们要互相交流(好过分哦)。他(她)们每个人都有唯一的一个好朋友,每一天,每个人会把当前所知的全部信息告诉给他(她)的好朋友。就这样一传十,十传百,终有一天,有一个人会从别人口中听到自己原本知道的信息。这时他(她)就会恍然大悟,明白这么传八卦是非常不地道的,他(她)就会勇敢地站出来,劝所有人停止这种无聊的游戏。

当事人\(Seaway\)只想知道,当这个万恶的游戏停止的时候,已经过了多少天...

输入格式

输入文件的第一行包括一个整数\(N\)表示一共有\(N\)个人。

接下来的一行,有\(N\)个整数\(T_1,T_2\cdots T_n\),其中第\(i\)个数表示第\(i\)个人的好朋友的编号。

输出格式

输出文件只包含一个整数,表示游戏停止的时候经过的天数。

提示:

数据范围:

\(1\le N\le 200000\)

命题背景:(UPD:2019.11.1)

我记得那是军训的一天,不是最后一天,应该是第二天或者是第一天。我在参加完一天的训练之后往机房走——无论如何,这里是不能断的。正巧碰到了她和她的闺蜜...在经过一天比较疲劳的训练之后,我已经对邂逅她不抱什么希望了。只是看到她,远远地看一眼,我就觉得我的一天的疲惫都在一瞬间抽走了,可能过一会就会回来,但至少在那个时候,我是很快乐的。

但是我突然看见她向着机房走去。是的,是鸣放宫后面的那条小路,我每天都要轻踏很多边的地方。

心一下子就乱了。我不知道她看没看见我,但是事实就是事实:那一定是她,她一定正在往那个方向走去。

我很讨厌背着书包跑步,因为那种上下颠簸的感觉让我觉得自己特别狼狈。

但是那天我背起书包就跑了过去。

于是就在机房门口不远的地方(还好门是关着的),我终于和她见面了。

真的觉得有一句话说的很对:每一次邂逅都是久别重逢。真的觉得没有什么偶遇和巧合,每一次我们碰见都觉得很巧,但其实我们预谋很久,想了很久:要看见对方,一定要。

所以我们看见了。在鸣放宫后面那个有很多木头的角落。

于是有了这道题。

题解:

\(Seaway\)的图论基础专场T4...

带权并查集之并查集求最小环。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int n,ans=1e9;
int fa[200001],dist[200001];
int find(int x)
{
    if(fa[x]!=x)
    {
        int last=fa[x];
        fa[x]=find(fa[x]);
        dist[x]+=dist[last];
    }
    return fa[x];
}
void unionn(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
    {
        fa[fx]=fy;
        dist[x]=dist[y]+1;
    }
    else
        ans=min(ans,dist[x]+dist[y]+1);
}
int main()
{
    //freopen("#10.in","r",stdin);
    //freopen("#10.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=n;i++)
    {
        int to;
        scanf("%d",&to);
        unionn(i,to);
    }
    printf("%d",ans);
    return 0;
}
posted @ 2019-08-23 20:15  Seaway-Fu  阅读(84)  评论(0编辑  收藏  举报