TLE两个点,求求
查看原帖
TLE两个点,求求
1774271
clandestine09楼主2025/7/25 17:59
#include<bits/stdc++.h>
using namespace std;
//本题思路:寻找最小环
int n,t;
const int MAXN = 200010;
vector <int> p[MAXN];
bool vis[MAXN];
int ans = 3000;
void dfs(int x,int step,int start){
    if(step>=1400) return ;
    if(step>=ans) return;
    if(vis[x]&&x==start){
			ans = min(ans,step);//步数对应的即为最小环长
    		return;
	} 
    vis[x]=1;
    for(int i = 0;i<p[x].size();i++)
    {
        dfs(p[x][i],step+1,start);
    }
    vis[x] =0; 
    //为什么要回溯?当从节点 x 出发探索完一条分支后,
    //需要将 x 标记为未访问,这样才能允许探索其他分支时再次经过 x。
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i = 1;i<=n;i++)
        cin>>t,p[i].push_back(t);
    for(int i = 1;i<=n;i++){
        dfs(i,0,i);
    }
    cout<<ans;
    return 0;
}
2025/7/25 17:59
加载中...