求助 WA on #19 #24 #24呜呜
查看原帖
求助 WA on #19 #24 #24呜呜
516722
WSSBWSSWSW楼主2024/9/9 20:50

先找环再dfs,调了好久还是wa要碎了QwQ

#include<bits/stdc++.h>
using namespace std;
const int N = 5e3+50;
int n,m,x,y,tot,h[N][2];
int cnt,a[N],f[N],rk,dfn[N];
vector<int> vis[N];
bool flag;
void findh(int u,int fa) {
	f[u] = fa;
	dfn[u]=++rk;
	for(auto v:vis[u]) {
		if(v==fa)continue;
		if(dfn[v]) {
			if(dfn[v]<dfn[u])continue;
			h[++tot][0] = u,h[tot][1] = v;
			for(;v!=u;v=f[v]) {
				h[++tot][0] = f[v],h[tot][1] = v;
			}
		}else{
			f[v] = u,findh(v,u);
		} 
	}
}
void dfs(int u,int fa){
	for(auto v:vis[u]){
		if(flag==-1)return ;
		if(v==fa)continue;
		if((v==x&&u==y)||(v==y&&u==x)){
			continue;
		}
		++cnt;
		if(flag==1||v<a[cnt]){
			flag = 1;
			a[cnt] = v;
			dfs(v,u);
		}else if(v>a[cnt]){
			flag = -1;
			return ;
		}else{
			dfs(v,u);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i = 1;i<=m;++i){
		scanf("%d%d",&x,&y);
		vis[x].push_back(y);
		vis[y].push_back(x);
	}
	for(int i = 1;i<=n;++i){
		sort(vis[i].begin(),vis[i].end());
	}
	cnt = 0;
	memset(a,0x3f,sizeof(a));
	a[++cnt] = 1;
	if(m==n-1){
		x = y = 0;
		flag = 0;
		dfs(1,0);
		for(int i = 1;i<=n;++i){
			printf("%d ",a[i]);
		}
		return 0;
	}
	findh(1,0);
	for(int i = 1;i<=tot;++i){
		flag = 0;
		cnt = 1;
		x = h[i][0],y=h[i][1];
		dfs(1,0);
	}
	for(int i = 1;i<=n;++i){
		printf("%d ",a[i]);
	}
	return 0;
}
2024/9/9 20:50
加载中...