【NOIP2015提高组】信息传递

https://www.luogu.org/problem/show?pid=2661

傻逼图论题,把我写成傻逼了。

DFS找环,每个结点第二次访问时更新答案。

但是图会有几个连通块,所以要分开讨论。

#include <iostream>
#include <cstring>
#include <cmath>
#define maxn 200005
using namespace std;
int n, nxt[maxn];
int dfn[maxn], color[maxn], ans = 0x7f7f7f7f;
void dfs(int v, int d, int c)
{
    if (dfn[v])
    {
        if(color[v] == c)
            ans = min(ans, d - dfn[v]);
    }
    else
    {
        dfn[v] = d;
        color[v] = c;
        dfs(nxt[v], d + 1, c);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> nxt[i];
    for (int i = 1; i <= n; i++)
    {
        if (!dfn[i])
            dfs(i, 1, i);
    }
    cout << ans;
    return 0;
}
原文地址:https://www.cnblogs.com/ssttkkl/p/7563158.html