记录编号 209590 评测结果 AAAAAAAAAA
题目名称 [NOIP 2015]信息传递 最终得分 100
用户昵称 GravatarTCtower 是否通过 通过
代码语言 C++ 运行时间 0.184 s
提交时间 2015-11-22 21:23:30 内存使用 4.14 MiB
显示代码纯文本
/*
昔日龌龊不足夸,今朝放荡思无涯。
春风得意马蹄疾,一日看尽长安花。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#define LOCAL
//#pragma comment(linker, "/STACK:10240000000,10240000000")
const int MAXN = 200000 + 200;
using namespace std;
int V[MAXN];
int dfn[MAXN], low[MAXN], n, m;
int vis[MAXN], pos, cnt[MAXN], x;//标记是否已经出栈
stack<int> S;

void init(){
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &V[i]);
    memset(dfn, 0, sizeof(dfn));
    memset(low, 0, sizeof(low));
    memset(vis, 0, sizeof(vis));
    pos = 0;
}
void dfs(int u, int num){
    dfn[u]  = low[u] = num;
    //printf("%d\n", dfn[3]);
    //printf("%d\n", num);
    S.push(u);
    if (vis[V[u]]) goto w;//不要找
    if (dfn[V[u]] == 0){
        dfs(V[u], num + 1);
        low[u] = min(low[u], low[V[u]]);
    }else low[u] = min(low[u], dfn[V[u]]);
    w:if (dfn[u] == low[u]){
        pos++;
        cnt[pos] = 0;
        do{
            x = S.top();
            S.pop();
            vis[x] = 1;
            cnt[pos]++;
        }while (x != u);
    }
    return;
}

int main(){
    #ifdef LOCAL
    freopen("2015message.in", "r", stdin);
    freopen("2015message.out", "w", stdout);
    #endif

    init();
    for (int i = 1; i <= n; i++){
        if (vis[i]) continue;
        dfs(i, 1);
    }
    int Ans = n;
    for (int i = 1; i <= pos; i++) if (cnt[i] != 1) Ans = min(Ans, cnt[i]);
    printf("%d\n", Ans);
    return 0;
}