92分wa#17#24哪里有问题??
查看原帖
92分wa#17#24哪里有问题??
125952
欧买歌楼主2019/11/13 16:00

照着双笙题解校对了好久

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
struct edge{
	int to,bot;
}e[1000005];
int head[500005],ecnt=0;
inline void add_edge(int u, int v){
	e[++ecnt].to=v;
	e[ecnt].bot=head[u];
	head[u]=ecnt;
	return ;
}
int in;
bool inloop[500005],vis[500005];
void dfs_loop(int now, int fa){
	vis[now]=true;
	for	(int i=head[now];i;i=e[i].bot){
		int nxt=e[i].to;
		if	(nxt!=fa){
			if	(vis[nxt] && !in){
				inloop[now]=true;
				in=nxt;
				return ;
			}
			if	(!vis[nxt]){
				dfs_loop(nxt,now);
				if	(in==nxt){
					return ;
				}
				if	(inloop[nxt]){
					inloop[now]=true;
					return ;
				}
			}else	return ;
		}
	}
	return ;
}
queue<int> ans;
bool bf[500005],flag=false;
void dfs_ans(int now, int fa, int rt){
	ans.push(now);
	bf[now]=true;
	priority_queue<int, vector<int>, greater<int> >	tmp;
	while	(!tmp.empty())	tmp.pop();
	for	(int i=head[now];i;i=e[i].bot){
		int nxt=e[i].to;
		if	(nxt!=fa)	tmp.push(nxt);
	}
	while	(!tmp.empty()){
		int nxt=tmp.top();
		tmp.pop();
		if	(bf[nxt])	continue;
		if	(!flag && inloop[now] && rt<nxt && tmp.empty()){
			flag=true;
			return ;
		}
		int udt=0;
		if	(!flag && !tmp.empty() && inloop[now] && inloop[nxt])	udt=tmp.top();
		dfs_ans(nxt,now,(udt?udt:rt));
	}
	return ;
}
int n,m;
int main(){
	memset(head,0,sizeof(head));
	memset(bf,false,sizeof(bf));
	memset(vis,false,sizeof(vis));
	memset(inloop,false,sizeof(inloop));
	scanf("%d%d",&n,&m);
	int u,v;
	for	(int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	if	(m==n)	dfs_loop(1,0);
	dfs_ans(1,0,1e9);
	while	(!ans.empty()){
		printf("%d ",ans.front());
		ans.pop();
	}
	return 0;
}
2019/11/13 16:00
加载中...