1 条题解
-
2
很显然,这道题直接模拟会MLE和TLE,所以我
#include<bits/stdc++.h> using namespace std; int n,a[200001],k=200001,z; bool b[200001]; int find(int i,int k1){ if(b[i]==1){ if(i==z){ return k1; } else{ return k; } } else{ b[i]=1; return find(a[i],k1+1); } } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ b[j]=0; } z=i; k=min(k,find(i,0)); } cout<<k; return 0; }(70分,最后3个测试点TLE)
事实上,这道题的本质是在有向图中寻找最小环的长度。每个节点的出度都为1,因此整个图由多个基环树组成,可以使用O(n)的算法来找到最小环。 因此
#include<bits/stdc++.h> using namespace std; int n,a[200001],vis[200001],dfs_id[200001],dfs_index[200001],ans=1e9; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ if(!vis[i]){ int u=i,step=0; while(!vis[u]){ vis[u]=1; dfs_id[u]=i; dfs_index[u]=step; u=a[u]; step++; } if(vis[u]==1&&dfs_id[u]==i){ ans=min(ans,step-dfs_index[u]); } } } cout<<ans; return 0; }
信息
- ID
- 2825
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 67
- 已通过
- 5
- 上传者