【NOIP2015】資訊傳遞
阿新 • • 發佈:2020-08-01
資料規模與約定
測試點編號 | nn的規模 |
---|---|
1 | n≤200n≤200 |
2 | |
3 | |
4 | n≤2500n≤2500 |
5 | |
6 | |
7 | n≤200000n≤200000 |
8 | |
9 | |
10 |
時間限制:1s
空間限制:128MB
#include <bits/stdc++.h> using namespace std; #define ll long long using namespace std; const int mod = 1e9+7;/// 998244353; const int mxn = 2e5 +7; int _,m,n,t,k,ans,cnt,lg; vectorView Code<int>e[mxn]; stack<int>s; int vis[mxn] , dfn[mxn] , low[mxn] ; void tarjan(int x) { vis[x] = 1 ; s.push(x); low[x] = dfn[x] = cnt++; for(int i=0 , v ;i<e[x].size();i++){ v = e[x][i] ; if(!dfn[v]){ tarjan(v); low[x] = min( low[x] , low[v] ); }else { low[x] = min( low[x] , dfn[v] ); } } if(dfn[x]==low[x]){ int res = 0 ; while(1){ int now = s.top(); s.pop(); vis[now] = 0 ; res++; if(now==x) break; } if(res>1) ans = min(res , ans ) ; } }void solve() { while(cin>>n) { cnt = 1 ; ans = mod ; for(int i=1;i<=n;i++){ cin>>k; e[i].push_back(k); } for(int i=1;i<=n;i++){ if(!vis[i]){ tarjan(i); } } cout<< ans <<endl; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); }