求助84分
查看原帖
求助84分
376662
zixiangzhan楼主2021/10/12 20:50
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
il int read()
{
	int s=0,w=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') w=-1;c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=(s<<1)+(s<<3)+c-'0';c=getchar();
	}return s*w;
}
const int N=5e5+10;
const int MAX=1e9;
int n,m,ans[N],cnt;
int R[N],dfn[N],timer,temp=MAX,tag=0; 
bool vis[N];

vector<int> vec[N];
struct node{
	int u,v;
}e[N<<1];
/*
R:rings 
temp:记录如果需要回溯那将去哪里
tag表示是否回溯过 
*/
il bool cmp(node c,node d){ return c.v<d.v; }
il int dfs_pre(int x,int fa)//判断有没有环 
{
	dfn[x]=++timer;int sz=vec[x].size();
	for(re int i=0;i<sz;i++){
		int vv=vec[x][i];
		if(vv==fa) continue;
		if(dfn[vv]){
			R[x]=1;return dfn[vv];
		}
		int tmp=dfs_pre(vv,x);
		if(tmp>0 && dfn[x]>=tmp){
			R[x]=1;return tmp;
		}
	}
	return 0;
}
il void dfs(int x)
{
	ans[++cnt]=x;
	vis[x]=1;
	int pre=temp;
	int sz=vec[x].size(); 
	for(re int i=0;i<sz;i++){
		if(vis[vec[x][i] ]) continue;
		int p=i+1,vv=vec[x][i];
		while(p<sz && vis[vec[x][p]]) p++;
		if(p>=sz && R[x] && R[vv] && (!tag)){
			tag=1;return;
		}
		temp=(p<sz)?vec[x][p]:pre;
		dfs(vv);
		temp=pre;
	}
}
int main()
{
	//freopen("P5049_17.in","r",stdin);
	//freopen("LZ.out","w",stdout);
	n=read(),m=read();
	for(re int i=1;i<=m;i++){
		e[i].u=read(),e[i].v=read();
		e[i+m].v=e[i].u,e[i+m].u=e[i].v;
	}
	sort(e+1,e+1+(m<<1),cmp);
	for(re int i=1;i<=(m<<1);i++) vec[e[i].u].push_back(e[i].v);
	dfs_pre(1,0);//printf("qwq\n");
	dfs(1);
	for(re int i=1;i<=n;i++) printf("%d ",ans[i]);
}

球求大佬康一眼蒟蒻的码吧,谢谢您 参照 @duoluoluo 的题解写的

2021/10/12 20:50
加载中...