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;
        else
            cout << "no" << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值