藍橋 - 小朋友崇拜圈 拓撲排序 留環

思路:拓撲排序可以判環 那麼也可以把非環的邊去掉
這樣我們只要成環的所有邊 這樣我們的圖就剩下了很多環
這樣每個環只搜一次然後記錄最大值即可。
雖然思路寫起來簡單但是很難想啊!!!

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define sdd(a,b) scanf("%d%d",&a,&b)
#define cl(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define sddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define dbg() printf("aaa\n")
using namespace std;
const int maxn=1e5+10;
int n;
int a[maxn];
int in[maxn];
bool con[maxn];
queue<int> q;
int main() {
    sd(n);
	rep(i,1,n){
        sd(a[i]);
        in[a[i]]++;
        con[i]=0;
    }
    rep(i,1,n){
        if(in[i]==0) q.push(i);
    }
    while(!q.empty()){
        int i=q.front();
        q.pop();
        in[a[i]]--;
        if(in[a[i]]==0){
            q.push(a[i]);
        }
    }//至此已經去掉所有環之外的點
    int maxx=0;
    rep(i,1,n){
        if(in[i]==0) continue;
        if(con[i]==true) continue;
        con[i]=true;
        int num=1;
        int t=a[i];
        while(t!=i){//這裏好好想想
            con[t]=true;
            t=a[t];
            num++;
        }
        if(maxx<num) maxx=num;
    }
    printf("%d\n",maxx);
	return 0;
}

題目描述
班裏N個小朋友,每個人都有自己最崇拜的一個小朋友(也可以是自己)。
在一個遊戲中,需要小朋友坐一個圈,
每個小朋友都有自己最崇拜的小朋友在他的右手邊。
求滿足條件的圈最大多少人?

小朋友編號爲1,2,3,…N

輸入
輸入第一行,一個整數N(3<N<100000)
接下來一行N個整數,由空格分開。
輸出
要求輸出一個整數,表示滿足條件的最大圈的人數。
樣例輸入

9
3 4 2 5 3 8 4 6 9

樣例輸出

4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章