码迷,mamicode.com
首页 > 其他好文 > 详细

【USACO】Strolling Cows

时间:2020-08-05 14:32:54      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:space   href   fine   tin   cpp   max   print   连通   ring   

Strolling Cows

给定有 \(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;
}

【USACO】Strolling Cows

标签:space   href   fine   tin   cpp   max   print   连通   ring   

原文地址:https://www.cnblogs.com/lpf-666/p/13439473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!