周末出游"/>
ZUFE 问题 D: 周末出游
题目描述
周末天气真好,大家组织一起出去玩(玩你妹,不好好学习),可是,有些人要知道(有好朋友了不起呀)自己最要好的朋友接受邀请了,他才会去,只有邀请到他们最好的朋友才会去(贱人就是矫情)。可是作为负责人的你(冤大头)必须判断是否能够办好这次聚会(气死爸爸拉,哼),邀请到所有的人。
输入
输入包含多组测试数据,每组测试数据第一行输入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;int f[20010],dp[20010], n, m, k, sum = 0;int getf(int v)
{if(f[v] == v)return v;else{f[v] = getf(f[v]);return f[v];}
}void merge(int x,int y)
{int t1, t2;t1 = getf(x);t2 = getf(y);if(t1 != t2){f[t2] = t1;}return ;
}int main()
{int a , b;while(cin >> n){memset(dp, 0 , sizeof(dp));memset(f,0,sizeof(f));for(int i = 1; i <= n ; i ++){cin >> f[i];if(f[i] == i)dp[i] = 1;}for(int j = 1 ; j <= 2000 ; j ++){for(int i = 1; i <= n ; i ++){if(dp[f[i]] == 1)dp[i] = 1;}}int flag = 1;for(int i = 1; i <= n ; i ++){if(dp[i] == 0){flag = 0;break;}}if(flag)cout << "yes" << endl;elsecout << "no" << endl;}return 0;
}
更多推荐
ZUFE 问题 D: 周末出游
发布评论