2015年提高组D1T2 信息传递
- 深搜
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, ans = 1e9, m; //有m个链或环
int t[N]; //信息传递对象
int a[N]; //i在第a[i]个链或环上
int idx[N]; //i是某个链或环上的第idx[i]个结点
void dfs(int u) {
int v = t[u]; //下一个结点
if (!a[v]) {
//如果未访问过
a[v] = a[u]; //属于同一个链或环
idx[v] = idx[u] + 1; //是这个链或环上的第idx[v]个结点
dfs(v);
}
else if (a[v] == a[u]) {
//说明这是一个环
ans = min(ans, idx[u] - idx[v] + 1);
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++) scanf("%d", &t[i]);
for (int i = 1; i <= n; i ++) {
if (!a[i]) {
a[i]