【模板】拓扑排序

//洛谷P2661求最小环用拓扑写,内含拓扑实现
#include<bits/stdc++.h>
#define MAX 200004
#define INF 0x3f3f3f
using namespace std;
int n,T,ro[MAX],ans=INF,dep;
bool b[MAX];
vector<int>G[MAX];
int  getdata()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
	    scanf("%d",&T);
		G[i].push_back(T);
		ro[T]++;
	}
}
void Topo()
{
	queue<int>q;
	for(int i=1;i<=n;i++)
	{
		if(!ro[i])
		{
		    b[i]=1;
			q.push(i);
		}
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<G[u].size();i++)
		{
			int v=G[u][i];
			ro[v]--;
			if(!ro[v])
            {
                q.push(v);
                b[v]=1;
            }
		}
	}
}
void dfs(int u)
{
    b[u]=1;
    dep++;
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i];
		if(b[v])continue;
		b[v]=1;
		dfs(v);
	}
}
int deal()
{
    for(int i=1;i<=n;i++)
    {
        dep=0;
        if(!b[i])dfs(i);
        if(dep)ans=min(dep,ans);
    }
    printf("%d\n",ans);
}
int main()
{
    getdata();
	Topo();
	deal();
	return 0;
}
0%