洛谷 P2661 信息传递
有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为Ti的同学。
游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮?
自己直接被降智,刚开始竟然没想出来
其实就是个并查集求最小环
果然不做做noip题就变傻了= =
Code
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
const int N = 2e5;
using namespace std;
int n,a,fa[N + 5],ans,cnt;
vector <int> d[N + 5];
int find(int x)
{
cnt++;
if (x == fa[x])
return x;
return find(fa[x]);
}
int main()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++)
fa[i] = i;
ans = N;
for (int i = 1;i <= n;i++)
{
cnt = 0;
scanf("%d",&a);
if (find(a) == i)
ans = min(ans,cnt);
else
fa[i] = a;
}
printf("%d\n",ans);
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步