로곡p2661 정보 전달
1778 단어 기초도론
게임이 시작되었을 때, 모든 사람은 자신의 생일만 알았다.이후 매 라운드마다 모든 사람은 자신이 현재 알고 있는 생일 정보를 각자의 정보 전달 대상에게 동시에 알려준다(주의: 누군가는 몇 명에게서 정보를 얻을 수 있지만 한 사람당 한 사람, 즉 자신의 정보 전달 대상에게만 알려준다).누군가가 다른 사람의 입에서 자신의 생일을 알게 되면 게임은 끝난다.실례지만 이 게임은 모두 몇 라운드를 진행할 수 있습니까?
입력 출력 형식 입력 형식: 총 22 줄입니다.
11 행에는 nn 개인을 나타내는 양의 정수 nn이 있습니다.
22행에는 nn개의 양의 정수 T 가 공백으로 구분됩니다.1,T_2,\cdots\cdots,T_nT 1, T 2,..., T n, 그중 ii번째 정수 TiT i는 ii로 번호를 매긴 학생의 정보 전달 대상이 T 임을 나타낸다iT i의 동창, Ti\leq nT i ≤n 및 Ti eq iT i ≠i .
출력 형식: 11개의 정수로 게임이 모두 몇 라운드를 진행할 수 있는지 나타낸다.
입력 출력 샘플 입력 샘플 #1: 복사 5 2 4 2 3 1 출력 샘플 #1: 복사 3 설명 샘플 1 설명
게임의 흐름은 그림과 같다.33라운드 게임을 마친 44번 게이머는 22번 게이머가 자신의 생일을 알려주는 소리를 듣고 33번으로 답한다.물론 33라운드 게임 후 22번 유저, 33번 유저는 모두 자신의 소식통에서 자신의 생일을 알 수 있어 게임 종료 조건에 부합된다.
30%30%의 데이터에 대해 n≤200n≤200;
60%60%의 데이터에 대해 n≤2500n≤2500;
100% 100%의 데이터에 대해 n≤200000n≤200000.
사고방식: 이 문제는 정보 교류를 할 때 중복된 정보 설명이 나타나는데 판환은 우리가 병렬로 조사하여 판별한다. 그러나 조상 함수를 조사할 때 우리는 수정을 해서 각 노드의 조상 조작을 갱신하지 않고 거리를 갱신하기 편리하다.
#include
#include
#include
#include
#include
using namespace std;
int cnt;
int f[200000];
int getf(int o,int &cnt) {// ,
cnt++;
if (f[o]==o) return o;
else
return getf(f[o],cnt);// ,
}
int n,t;
int main()
{cin>>n;
int ans=9999999;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=n;i++)
{cnt=0;
cin>>t;
if(getf(t,cnt)==i)
ans=min(ans,cnt);
else//
f[i]=t;
}
cout<