60pt求助
查看原帖
60pt求助
288716
lzqy_楼主2020/10/20 20:03

rt,求最小环做法,时间复杂度 O(N)O(N) 应该很稳吧/yiw

#include<bits/stdc++.h>
using namespace std;
int n,a[200001];
bool k[200001];
int ans=INT_MAX;
inline int read()                    
{
  int x=0;
  char c=getchar();
  for(; c<'0'  || c>'9';  c=getchar());
  for(; c<='9' && c>='0'; c=getchar())
    x=(x<<3)+(x<<1)+c-'0';            
  return x;
}

int huan(int x)
{
  int sum=1,xx=a[x];
  while(xx!=x)
  {
    sum++;
    xx=a[xx];
  }
  return sum;
}
int main()
{
	int x;
  cin>>n;
  for(int i=1; i<=n; i++)
    a[i]=read();
  for(int i=1; i<=n; i++)
  {
    if(k[i]==0)
    {
      x=a[i];
      while(1)
      {
        k[x]=1;
        x=a[x];
        if(k[x]==1)
        {
          ans=min(ans,huan(x));
          break;
        }
      }
    }
  }
  cout<<ans;
  return 0;
}
2020/10/20 20:03
加载中...