本文主要是介绍neuq-acm预备队训练week 8 P2661 [NOIP2015 提高组] 信息传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目背景
NOIP2015 Day1T2
题目描述
有 n 个同学(编号为 1 到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。
游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮?
题目限制
输入格式
输出格式
共一行一个整数,表示游戏一共可以进行多少轮。
输入输出样例
解题思路
把每个同学看成一个点,信息的传递就是在他们之间连有向边,游戏轮数就是求最小环
AC代码
#include <bits/stdc++.h>
using namespace std;
int n,Min,last;
int f[200005],d[200005];
int F(int x);
void check(int a,int b);
int main()
{int t;Min=0x7777777;cin>>n;for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=n;i++){cin>>t;check(i,t);}cout<<Min;return 0;
}void check(int a,int b)
{int x=F(a),y=F(b);if (x!=y){f[x]=y;d[a]=d[b]+1;} //若不相连,则连接两点,更新父节点和路径长。elseMin=min(Min,d[a]+d[b]+1); //若已连接,则更新最小环长度
}int F(int x)
{if(f[x]!=x){int last=f[x];f[x]=F(f[x]);d[x]+=d[last];}return f[x];
}
这篇关于neuq-acm预备队训练week 8 P2661 [NOIP2015 提高组] 信息传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!