神奇的MLE,求助
查看原帖
神奇的MLE,求助
71947
Stupid_xyf_2楼主2022/10/18 23:01
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=5e+5+50;
bool vis[maxn],f[maxn],flg;
struct Node {
	int u,v;
	bool operator <(const Node &rhs)const {
		return u==rhs.u?v<rhs.v:u<rhs.u;
	}
} eg[maxn*2];
struct Edge {
	int nxt,to;
} edge[maxn*2];
int hd[maxn],tot;
inline void add(int u,int v) {
	edge[++tot].to=v;
	edge[tot].nxt=hd[u];
	hd[u]=tot;
}
int n,m;
int a[maxn],fa[maxn],cnt;
int tmp=0x3f3f3f3f;
void dfs(int u) {
	a[++cnt]=u,vis[u]=true;
	for(register int i=hd[u]; i; i=edge[i].nxt) {
		int v=edge[i].to;
		if(!vis[v])dfs(v);
	}
}
void dfs2(int u,int pa) {
	if(flg)return ;
	if(fa[u]==0)fa[u]=pa;
	else if(fa[u]!=pa) {
		while(pa!=u)
			f[pa]=true,pa=fa[pa];
		f[u]=flg=true;
		return ;
	}
	for(register int i=hd[u]; i; i=edge[i].nxt) {
		int v=edge[i].to;
		if(v!=pa)dfs2(v,u);
	}
}
void dfs3(int u) {
	a[++cnt]=u,vis[u]=true;
	if(f[u]) {
		bool flag=false;
		for(register int i=hd[u]; i; i=edge[i].nxt) {
			if(flg)break;
			int v=edge[i].to;
			if(!vis[v]&&f[v]) {
				i=edge[i].nxt;
				while(vis[edge[i].to])i=edge[i].nxt;
				if(i) {
					tmp=edge[i].to;
				} else if(tmp<v)
					flag=flg=true;
			}
		}
		for(register int i=hd[u]; i; i=edge[i].nxt) {
			int v=edge[i].to;
			if(vis[v]||(f[v]&&flag))continue;
			dfs3(v);
		}
	} else for(register int i=hd[u]; i; i=edge[i].nxt) {
			int v=edge[i].to;
			if(!vis[v])dfs3(v);
		}
}
int main() {
	scanf("%d%d",&n,&m);
	for(register int i=1; i<=m; i++) {
		int x,y;
		scanf("%d%d",&x,&y);
		eg[i*2-1].u=eg[i*2].v=x;
		eg[i*2].u=eg[i*2-1].v=y;
	}
	sort(eg+1,eg+m*2+1);
	for(register int i=2*m; i>=1; i--)
		add(eg[i].u,eg[i].v);
	if(m==n-1) {
		dfs(1);
		for(register int i=1; i<=n; i++)
			printf("%d ",a[i]);
		printf("\n");
		return 0;
	}
	dfs2(1,0);
	flg=0;
	dfs3(1);
	for(register int i=1; i<=n; i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}
2022/10/18 23:01
加载中...