zoukankan      html  css  js  c++  java
  • Codeforces Round #464 (Div. 2) A Determined Cleanup

    A. Love Triangle

    time limit per test1 second
    memory limit per test256 megabytes

    Problem Description

    As you could know there are no male planes nor female planes. However, each plane on Earth likes some other plane. There are n planes on Earth, numbered from 1 to n, and the plane with number i likes the plane with number fi, where 1 ≤ fi ≤ n and fi ≠ i.

    We call a love triangle a situation in which plane A likes plane B, plane B likes plane C and plane C likes plane A. Find out if there is any love triangle on Earth.

    Input

    The first line contains a single integer n (2 ≤ n ≤ 5000) — the number of planes.

    The second line contains n integers f1, f2, …, fn (1 ≤ fi ≤ n, fi ≠ i), meaning that the i-th plane likes the fi-th.

    Output

    Output «YES» if there is a love triangle consisting of planes on Earth. Otherwise, output «NO».

    You can output any letter in lower case or in upper case.

    Examples

    input
    5
    2 4 5 1 3
    output
    YES
    input
    5
    5 5 5 5 1
    output
    NO

    Note

    In first example plane 2 likes plane 4, plane 4 likes plane 1, plane 1 likes plane 2 and that is a love triangle.

    In second example there are no love triangles.


    解题心得:

    1. 其实题意很简单,就是问你给出的连线中是否能够形成三角形。
    2. 其实很简单,每个点的出度只能为1,这样直接枚举每个点,回溯两次看是否可以回溯到自身就行了。刚开始没有注意到每个点的出度只能为1,写了一个比较复杂的dfs。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 5010;
    
    int n,to[maxn];
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&to[i]);
    
        bool flag = false;
    
        for(int i=1;i<=n;i++)
            if(to[to[to[i]]] == i)
                flag = true;
    
        if(flag)
            printf("YES");
        else
            printf("NO");
        return 0;
    }

    写得很繁琐的智障代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 5010;
    
    int n;
    bool flag,vis[maxn];
    vector <int> ve[maxn];
    
    void dfs(int pos,int pre,int cnt){
        vis[pos] = true;
        if(flag)
            return ;
        for(int i=0;i<ve[pos].size();i++) {
            int v = ve[pos][i];
            if(cnt == 3 && vis[v] && v != pre)
                flag = true;
            if(cnt == 3 && (!vis[v] || v == pre))
                continue;
            dfs(v,pos,cnt+1);
        }
        return ;
    }
    
    void check(){
        for(int i=1;i<=n;i++){
            memset(vis,0,sizeof(vis));
            dfs(i,-1,1);
        }
    }
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int temp;
            scanf("%d",&temp);
            ve[i].push_back(temp);
        }
    
        check();
    
        if(flag)
            printf("YES");
        else
            printf("NO");
        return 0;
    }
  • 相关阅读:
    Android开发 设置控件边角半圆
    Android开发 使用XML文件设置背景变化
    Android开发 ImageButton加载drawable文件问题
    Android开发 网络检测(使用广播监听)
    android studio无法在可视化页面预览布局文件
    jdbc连接oracle数据库
    「数学」- 暑假后文化课能力复健 20210906 ~ 20210912
    「数学」- 暑假后文化课能力复健 20210830 ~ 20210905
    「数学」高等代数学习笔记
    「数学」浅谈极值点偏移问题的处理技巧
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107170.html
Copyright © 2011-2022 走看看