信息传递()

https://www.luogu.com.cn/problem/P2661

  • 题目要求为求最短的环
  • 在并查集的fa()中找i点连接的点t的祖先
  • 找的过程不要合并,只要递归找祖先就好,同时每递归一层就路径长度计数加一
  • 如果找到的祖先就是i,(表示该处形成了环,那么就更新答案但不要连接,否则后面会进入死循环)
  • 如果没找到就修改祖先数组为祖先
// https://www.luogu.com.cn/problem/P2661
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 200005
int f[MAX];
int cnt;
int fa(int x)
{
    cnt++;
    if (f[x] == x)
        return x;
    else
        return fa(f[x]);
}
int n, t;

int main()
{
    cin >> n;
    int ans = MAX * 100;
    for (int i = 1; i <= n; i++)
        f[i] = i;
    for (int i = 1; i <= n; i++)
    {
        cnt = 0;
        scanf("%d", &t);
        if (fa(t) == i)
            ans = min(ans, cnt);
        else
            f[i] = t;
    }
    printf("%d", ans);
}
————————

https://www.luogu.com.cn/problem/P2661

  • 题目要求为求最短的环
  • 在并查集的fa()中找i点连接的点t的祖先
  • 找的过程不要合并,只要递归找祖先就好,同时每递归一层就路径长度计数加一
  • 如果找到的祖先就是i,(表示该处形成了环,那么就更新答案但不要连接,否则后面会进入死循环)
  • 如果没找到就修改祖先数组为祖先
// https://www.luogu.com.cn/problem/P2661
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 200005
int f[MAX];
int cnt;
int fa(int x)
{
    cnt++;
    if (f[x] == x)
        return x;
    else
        return fa(f[x]);
}
int n, t;

int main()
{
    cin >> n;
    int ans = MAX * 100;
    for (int i = 1; i <= n; i++)
        f[i] = i;
    for (int i = 1; i <= n; i++)
    {
        cnt = 0;
        scanf("%d", &t);
        if (fa(t) == i)
            ans = min(ans, cnt);
        else
            f[i] = t;
    }
    printf("%d", ans);
}