90pts #2TLE 悬关求优化
查看原帖
90pts #2TLE 悬关求优化
1368189
znzryb楼主2024/8/25 20:39
//https://www.luogu.com.cn/problem/P2661
// dfs加剪枝优化(即遍历过的点不再遍历)(因为所有点都得进入一遍)
#include <iostream>
#include <bitset>
#include <unordered_set>
using namespace std;
const int maxn=2e5+10;
int n,son[maxn],minCircle=maxn,cntx[maxn],cntIsSearched;
bitset<maxn> vis;
unordered_set<int> curr_vis;
void dfs(int x,int cnt) {
    if(!vis[x]) {
        if(curr_vis.find(x)!=end(curr_vis)) {
            minCircle=min(minCircle,cnt-cntx[x]);
            return;
        }
        cntx[x]=cnt;
        curr_vis.insert(x);
        dfs(son[x],cnt+1);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>son[i];
    }
    for(int i=1;i<=n;i++) {
        curr_vis={};
        dfs(i,1);
        if(cntIsSearched==n)
            break;
        for(auto ch:curr_vis) {
            vis[ch]=true;
            cntIsSearched+=1;
        }
    }
    cout<<minCircle<<endl;
    return 0;
}
// 90% #2TLE https://www.luogu.com.cn/record/174720497
2024/8/25 20:39
加载中...