洛谷 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;
}