整个题目:
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,...N
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。
要求输出一个整数,表示满足条件的最大圈的人数。
例如:
输入格式
9
3 4 2 5 3 8 4 6 9
则程序应该输出:
4
解释:
如图所示,崇拜关系用箭头表示,红色表示不在圈中。
显然,最大圈是[2 4 5 3] 构成的圈
再例如:
输入格式
30
22 28 16 6 27 21 30 1 29 10 9 14 24 11 7 2 8 5 26 4 12 3 25 18 20 19 23 17 13 15
程序应该输出:
16
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
简单分析:
查长度,那么可以认为是dfs搜索,搜完了比每条线的长度就可以了。所以,难度还是可以的。
C++
#include<iostream> #include<algorithm> using namespace std; int vis[100009]; int ans; int indug[100009]; int vis1[100009]; void dfs(int n,int qi,int l) { if(vis[n]==qi) { ans=max(ans,l); return; } vis1[vis[n]]=1; dfs(vis[n],qi,l+1); } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>vis[i]; indug[vis[i]]++; } for(int i=1;i<=n;i++) { if(vis1[i]==0&&indug[i]!=0) { vis1[i]=1; dfs(i,i,1); } } cout<<ans; return 0; }
C
#include<stdio.h> #define MAX 100005 int state[MAX]; int arr[MAX]; int ans; void dfs(int k,int step){ if(state[arr[k]]!=0){ if(step-state[arr[k]]+1>ans)ans=step-state[arr[k]]+1; return; } state[k]=step; dfs(arr[k],step+1); } int main() { int n; scanf("%d",&n); int i; for(i=1;i<=n;i++)scanf("%d",&arr[i]); for(i=1;i<=n;i++)dfs(i,1); printf("%d",ans); return 0; }
Java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; public class Main { public static void main(String[] args) throws IOException { n = nextInt(); isWorship = new boolean[n+1]; a = new int[n+1]; for(int i = 1;i <= n;i++) { int x = nextInt(); isWorship[x] = true; a[i] = x; } for(int i = 1;i <= n;i++) { if(isWorship[i]) { start = i; dfs(i,0); } } System.out.println(max); } private static void dfs(int x, int s) { if(x > n) return; if(x == start && s != 0) { max = Math.max(s, max); return; } if(!isWorship[x]) { return; } isWorship[x] = false; dfs(a[x],s+1); } static int nextInt() throws IOException { st.nextToken(); return (int) st.nval; } static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); static int start,a[],n,max; static boolean[] isWorship; }
Python
from collections import defaultdict n=int(input()) l=[0]+list(map(int,input().split())) vis=defaultdict(int) ans=0 for i in range(1,n+1): if not vis[i]: now=l[i] k=1 vis[i]=k while not vis[now]: k+=1 vis[now]=k now=l[now] ans=max(ans,k-vis[now]+1) print(ans)