1 条题解

  • 2
    @ 2025-11-12 21:52:35

    很显然,这道题直接模拟会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;
    }
    
    • 1

    信息

    ID
    2825
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    67
    已通过
    5
    上传者