求助!为啥加了找环后最后三个点炸了!
查看原帖
求助!为啥加了找环后最后三个点炸了!
249683
CCCloud楼主2021/10/6 10:57

searchsearch函数,没加前反而过了,感觉写炸了,但查不出来(

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAXN=5005;
int n, m, x, y, uu, vv, dis, cnt, c[MAXN], d[MAXN], f[MAXN], dad[MAXN], e[MAXN][3], a[MAXN][MAXN];
bool ft, vis[MAXN];

void dfs1(int u)
{
	for(int i=1; i<=c[u]; i++)
	{
		int v=a[u][i];
		if(vis[v]) continue;
		vis[v]=1;
		d[++cnt]=v;
		dfs1(v);
	}
}

void work1()
{
	vis[1]=1;
	d[cnt=1]=1;
	dfs1(1);
	for(int i=1; i<=n; i++)
		printf("%d ", d[i]);
	puts("");
}

void dfs2(int u, int fa)
{
	for(int i=1; i<=c[u]; i++)
	{
		int v=a[u][i];
		if(v==fa) continue;
		if(vis[v] || (u==uu && v==vv) || (u==vv && v==uu)) continue;
		vis[v]=1;
		f[++cnt]=v;
		dfs2(v, u); 
	}
}

void search(int u) //找环 
{
	vis[u]=1;
	for(int i=1; i<=c[u]; i++)
	{
		int v=a[u][i];
		if(v==dad[u]) continue;
		if(vis[v])
		{
			ft=1;
			for(int i=v; i; i=dad[i])
			{
				//printf("%d %d %d\n", dis, dad[i], i);
				dis++;
				e[dis][1]=i, e[dis][2]=dad[i];
			}
		}
		if(ft) return;
		dad[v]=u;
		search(v);
	}
}

void update()
{
	memcpy(d, f, sizeof(f));
}

bool check()
{
	for(int i=1; i<=n; i++)
		if(d[i]!=f[i]) return d[i]>f[i];
}

void work2()
{
	search(1);
	for(int i=1; i<=dis; i++)
	{
		cnt=0, uu=e[i][1], vv=e[i][2];
		memset(vis, 0, sizeof(vis));
		
		vis[1]=1;
		f[cnt=1]=1;
		dfs2(1, 0);
		
		if(cnt==n && d[1]==0) update();
		if(cnt<n || !check()) continue;
		update();
	}
	
	for(int i=1; i<=n; i++)
		printf("%d ", d[i]);
	puts("");
} 

int main()
{
	scanf("%d%d", &n, &m);
	for(int i=1; i<=m; i++)
	{
		scanf("%d%d", &x, &y);
		a[x][++c[x]]=y;
		a[y][++c[y]]=x;
	}
	
	for(int i=1; i<=n; i++)
		sort(a[i]+1, a[i]+1+c[i]);
	
	if(m==n-1) work1();
	else work2();
}
2021/10/6 10:57
加载中...