标签:space href fine tin cpp max print 连通 ring
给定有 \(n\) 个点 \(n\) 条边的有向图,每个点的出度都为 \(1\),求图中的最大环。
显然入度为 \(0\) 的点不可能为最大环上的点,所以考虑删点。
然后遍历每个连通块记录最大即可。
(史上最短题解?)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#define N 30010
using namespace std;
int n,to[N],ru[N],ans=1;
bool vis[N];
int read(){
int x=0,f=1;char c=getchar();
while(c<‘0‘ || c>‘9‘) f=(c==‘-‘)?-1:1,c=getchar();
while(c>=‘0‘ && c<=‘9‘) x=x*10+c-48,c=getchar();
return x*f;
}
int main(){
//freopen("stroll.in","r",stdin);
//freopen("stroll.out","w",stdout);
n=read();
memset(ru,0,sizeof(ru));
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
to[i]=read(),++ru[to[i]];
for(int i=1;i<=n;i++){//删点。
if(vis[i]) continue;
int now=i;
while(!ru[now]){
vis[now]=true;
--ru[to[now]];
now=to[now];
}
}
int ans=1;
for(int i=1;i<=n;i++){//遍历连通块。
if(vis[i]) continue;
vis[i]=true;
int now=to[i],sum=1;
while(now!=i)
++sum,vis[now]=true,now=to[now];
ans=max(ans,sum);
}
printf("%d\n",ans);
//fclose(stdin);fclose(stdout);
return 0;
}
标签:space href fine tin cpp max print 连通 ring
原文地址:https://www.cnblogs.com/lpf-666/p/13439473.html