思路
找长度不小于k的循环体。直接深搜,数组ans记录路径,当搜到之前走时判断循环长度是否达标。
还可以将路径和是否走过的数组合在一起,这样更快。
实现
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
vector<int> edge[maxn];
int n,m,k,f;
bitset<maxn> vis;
vector<int> ans;
void dfs(int now){
if (f) return;
for(auto i: edge[now]){
if (vis[i]==1){
int be = find(ans.begin(),ans.end(),i)-ans.begin();
int len = ans.size()-be;
if (len>=k+1) {
cout<<len<<endl;
for(int j=0;j<len;j++){
cout<<ans[be+j]<<" ";
}cout<<endl;
return void(f=1);
}
}else{
vis[i] = 1;ans.push_back(i);
dfs(i);
if (f) return;
vis[i] = 0;ans.pop_back();
}
}
}
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++) vis[i]=0;
for(int i=1,a,b;i<=m;i++){
cin>>a>>b;
edge[a].push_back(b);
edge[b].push_back(a);
}
f = 0;
for(int i=1;i<=n;i++){
vis[i] = 1;ans.push_back(i);
dfs(i);
vis[i] = 0;ans.pop_back();
if (f) return;
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
}
感悟
求vector<int>中元素的位置find(vector.begin(),vector.end(),i)-vector.begin()。find(vector.begin(),vector.end(),i)返回的时迭代器的位置而非寻找元素的位置。