【DFS】周末出游 校OJ2348

题目描述

周末天气真好,大家组织一起出去玩(玩你妹,不好好学习),可是,有些人要知道(有好朋友了不起呀)自己最要好的朋友接受邀请了,他才会去,只有邀请到他们最好的朋友才会去(贱人就是矫情)。可是作为负责人的你(冤大头)必须判断是否能够办好这次聚会(气死爸爸拉,哼),邀请到所有的人。

输入

输入包含多组测试数据,每组测试数据第一行输入n(0<n<1000),表示有n个人。然后第二行输入n个数,a[1],a[2],a[3].....a[n] (0<a[i]<=n) 。

对于第 i 个人来说,a[i] 是他的好朋友, 如果 a[i] 参加了,那么 i 也会参加。

如果a[i]=i,表示编号为 i 的同学一定会去(注孤)。

输出

如果能邀请到所有输出yes,反之no。

样例输入

4
1 2 3 3

样例输出

yes

提示

对样例数据的解释:第一行输入了4,表示有4个人,编号分别为1,2,3,4。


第二行,


a[1]=1表示编号为1的同学一定会去;


a[2]=2表示编号为2的同学一定会去;


a[3]=3表示编号为3的同学一定会去;


a[4]=3表示如果编号为3的同学去了,那么编号为4的同学也会去。


因为已经确定3一定去,所以4也去了。


因此所有人都去了,输出yes。


#include <bits/stdc++.h>
using namespace std;

const int mn=1010;
bool dp[mn];
int to[mn],fr[mn],nx[mn];

void dfs(int x)
{
	dp[x]=1;  //去
	for(int i=fr[x];i!=-1;i=nx[i])
	{
		int t=to[i];  //影响的人
		if(!dp[t])
			dfs(t);
	}
}

int main()
{
	int n;
	while(~scanf("%d",&n))
	{

		memset(dp,0,sizeof(dp));
		memset(fr,-1,sizeof(fr));

		int a[mn];
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			to[i]=i;
			nx[i]=fr[a[i]];
			fr[a[i]]=i;
		}  //a[i]为起点 i为终点

		for(int i=1;i<=n;i++)
		{
			if(i==a[i]&&!dp[i])  //必去的人
				dfs(i);
		}

		bool flag=1;
		for(int i=1;i<=n;i++)
		{
			if(!dp[i])
				flag=0;
		}
		if(flag)
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}



猜你喜欢

转载自blog.csdn.net/ummmmm/article/details/80352438
今日推荐