题目描述
Love Triangle (三角恋)
告诉你每个人喜欢谁,问你这堆人里面有没有三角恋存在
输入描述
- 第一行输入一个整数N(2≤ N ≤5000),表示有N个人
- 第二行输入整数 F 1 , F 2 , F 3 , ⋯ , F N ( 1 ⩽ F i ⩽ N , F i ≠ i ) F_1,F_2,F_3, \cdots \,\,,F_N\,\,\left( 1\leqslant F_i\leqslant N,F_i\ne i \right) F1,F2,F3,⋯,FN(1⩽Fi⩽N,Fi=i),这意味着第i个人喜欢第 F i F_i Fi个人。
输出描述
如果有三角恋关系输出YES,没有输出NO
输入输出样例
//Example1:
//Input
5
2 4 5 1 3
//Output
YES
//Example2:
//Input
5
5 5 5 5 1
//Output
NO
线索提示
第一组示例的线索关系如下:
一号、四号和二号成三角恋了,所以题设成立!
一、解题思路
主要核心的思想也不难,如果过往并查集那一块想可能有点把问题复杂化了
核心思想: 遍历关系网中的元素,找到小人A 所喜欢的人 所喜欢的人 所喜欢的人 所喜欢的人 是不是小人A自己?
如果是的话,就有三角恋关系了 (有点绕,特意用空格隔开了,不懂的兄弟可以看一下上面的图)
二、题解
源代码
代码如下:
/*
* Author: FeverTwice
* Date: 2021-05-02
* Func: Love Triangle
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <math.h>
#include <functional>
#define debug(a) cout<<#a<<"="<<a<<endl;
#define lyh(i,a,b) for(int i=a;i<=b;i++)
#define hyl(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define mm memset
#define EPS 1e-8
#define INF 0x7fffffff
using namespace std;
int main()
{
ios::sync_with_stdio(0); //加快cin的输入流读写处理速度
int n;
cin >> n;
int* arr = new int[n+1];
int flag = 0;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
}
for (int i = 1; i <= n; i++)
{
int like = arr[i]; //like,自己喜欢的人
int llike = arr[like]; //llike,自己喜欢的人 所喜欢的人
if (arr[llike] == i)
{//如果llike,自己喜欢的人 所喜欢的人 所喜欢的人是自己
flag = 1;
break;
}
}
if (flag == 1)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
return 0;
}
VJudge评判结果
写在最后
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知