ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

3170. 小朋友崇拜圈

2022-04-04 12:02:13  阅读:155  来源: 互联网

标签:10 int 崇拜 样例 template 3170 小朋友 define


题目链接

3170. 小朋友崇拜圈

班里 \(N\) 个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。

在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。

求满足条件的圈最大多少人?

小朋友编号为 \(1,2,3,…N\)。

输入格式

第一行,一个整数 \(N\)。

接下来一行 \(N\) 个整数,由空格分开。

输出格式

输出一个整数,表示满足条件的最大圈的人数。

数据范围

\(3<N<10^5\)

输入样例1:

9
3 4 2 5 3 8 4 6 9

输出样例1:

4

样例1解释

如下图所示,崇拜关系用箭头表示,红色表示不在圈中。

显然,最大圈是 \([2 4 5 3]\) 构成的圈。

image

输入样例2:

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

输出样例2:

16

解题思路

dfs,有向图最大环数

将每个小朋友当作图上的节点,将每个节点连向他右边的小朋友,记录每个节点的入度,首先将那些入度为 \(0\) 的节点删除,因为这些节点一定不在环上,再遍历一遍那些入度不为 \(0\) 的节点,再dfs一遍,直到到达起始点更新答案

  • 时间复杂度:\(O(n)\)

代码

// %%%Skyqwq
#include <bits/stdc++.h>
#include <tr1/unordered_map>
#include <tr1/unordered_set>

//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
using namespace tr1;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;

template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }

template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}
template <typename T>
void print(T x) {
    if (x < 0) putchar('-'), x = -x;
    if (x < 10) putchar(x + 48);
    else print(x / 10), putchar(x % 10 + 48);
}

template <typename T>
void print(T x, char t) {
    print(x); putchar(t);
}

const int N=1e5+5;
int n,in[N];
vector<int> adj[N];
int res=0;
bool v[N];
void dfs(int x,int cnt,int first)
{
	
	for(int y:adj[x])
	{
		if(y==first)
		{
		    res=max(res,cnt);
		    return ;
		}
		if(v[y]||!in[y])continue;
		v[y]=true;
		dfs(y,cnt+1,first);
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		in[x]++;
        adj[x].pb(i);
	}
	for(int i=1;i<=n;i++)
		if(in[i]&&!v[i])
		{
			v[i]=true;
			dfs(i,1,i);
		}
	cout<<res; 
    return 0;
}

标签:10,int,崇拜,样例,template,3170,小朋友,define
来源: https://www.cnblogs.com/zyyun/p/16098730.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有