基环树找环 求助
  • 板块学术版
  • 楼主hakurei__
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/19 14:22
  • 上次更新2023/10/22 18:46:16
查看原帖
基环树找环 求助
338402
hakurei__楼主2023/9/19 14:22

555, WA了一些点

Link


#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N=2e5+5,M=N<<1 ;

int hd[N],all=1,nxt[M],go[M] ;
void _add(int x,int y){ nxt[++all]=hd[x]; hd[x]=all; go[all]=y;}

int n,flg=0, S,T,vis[N],pre[N],ban;
 
void dfs(int x,int fa){
	vis[x]=1;if(flg) return;
	
	for(int i=hd[x];i;i=nxt[i]){
		int y =go[i] ;
		if(vis[y]&&y!=fa){
			flg=1; S=x,T=y;  ban=i; return ;
		}
		if(y!=fa) dfs(y,x) ;
	}
}
void bfs(){
	queue<int> q; memset(vis,0,sizeof vis) ; 
	q.push(S);
	vis[S]=1;
	while(q.size()){
		int x= q.front();  q.pop();// cout<<x<<'\n';
		for(int i=hd[x];i;i=nxt[i]){
			int y =go[i] ;
			if(vis[y]==0&& (i!=ban) && ( (i^1)!=ban)){
				vis[y]=1; pre[y]=x;
				q.push(y) ;
				if(y==T) return ;
			}
		}
	}
}
signed main(){
	cin>>n; 
	for(int  x,i=1;i<=n;i++) cin>>x,_add(i,x),_add(x,i);
	for(int i=1;i<=n&&flg==0;i++) if(vis[i]==0) dfs(i,0);
	// cout <<ban<<endl;
	bfs();
	vector<int>kk; 
	for(int i=T;;i=pre[i]) {
		kk.push_back(i) ;
		if(i==S) break;
	}
	cout <<kk.size()<<endl;for(auto x:kk) cout<<x<<' ';
	
}



2023/9/19 14:22
加载中...