OJ题号:洛谷2661
思路:求最小环。DFS+记忆化。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 int main() { 5 int n; 6 scanf("%d",&n); 7 int t[n+1],w[n+1],s[n+1]; 8 memset(s,0,sizeof s); 9 for(int i=1;i<=n;i++) scanf("%d",&t[i]); 10 int ans=0x7fffffff; 11 for(int i=1;i<=n;i++) { 12 int cnt=0,p; 13 for(p=i;!s[p];p=t[p]) { 14 s[p]=i; 15 w[p]=cnt++; 16 } 17 if(s[p]==i) ans=std::min(ans,cnt-w[p]); 18 } 19 printf("%d ",ans); 20 return 0; 21 }