2018.11.02 洛谷P2661 信息传递(拓扑排序+搜索)

时间:2021-09-11 16:12:59

传送门

按照题意模拟就行了。

先拓扑排序去掉不在环上面的点。

剩下的都是简单环了。

于是都dfsdfsdfs一遍求出最短的环就行。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,du[N],nxt[N],ans=0x3f3f3f3f;
bool vis[N];
inline int dfs(int p,int len){
	if(vis[p])return len;
	vis[p]=1;
	return dfs(nxt[p],len+1);
}
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int main(){
	queue<int>q;
	n=read();
	for(int i=1;i<=n;++i)++du[nxt[i]=read()];
	for(int i=1;i<=n;++i)if(!du[i])q.push(i);
	while(!q.empty()){
		int x=q.front();
		q.pop(),vis[x]=1;
		--du[nxt[x]];
		if(!du[nxt[x]])q.push(nxt[x]);
	}
	for(int i=1;i<=n;++i)if(!vis[i])ans=min(ans,dfs(i,0));
	cout<<ans;
	return 0;
}