啊啊啊蒟蒻60分求助……
查看原帖
啊啊啊蒟蒻60分求助……
362165
songhx楼主2021/9/11 09:41
#include <bits/stdc++.h>
using namespace std;
int n,m,ta,tb;
vector <int> g[5001];
bool vis[5001];
int head[5001],ans[5001],now[5001],cnt;

struct Egde {
	int v,nxt;
} e[10005];

void addEdge(int u,int v) {
	e[++cnt].v = v;
	e[cnt].nxt = head[u];
	head[u] = cnt;
	return;
}

void dfs(int x) {
	now[++cnt] = x;
	vis[x] = 1;
	for(int i = head[x]; i != -1; i = e[i].nxt) {
		if(n == m && ((x == ta && e[i].v == tb) || (x == tb && e[i].v == ta))) continue;
		if(!vis[e[i].v]) dfs(e[i].v);
	}
	return;
}

int main() {
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int i = 0; i < m; i++) {
		int a,b;
		scanf("%d%d",&a,&b);
		g[a].push_back(b);
		g[b].push_back(a);
	}
	for(int i = 1; i <= n; i++) {
		sort(g[i].begin(),g[i].end());
		reverse(g[i].begin(),g[i].end());
		for(int j = 0; j < g[i].size(); j++) {
			addEdge(i,g[i][j]);
		}
	}
	cnt = 0;
	if(m == n - 1) {
		dfs(1);
		for(int i = 1; i <= n; i++) printf("%d ",now[i]);
		return 0;
	}
	ans[1] = 2;
	for(int i = 1; i <= n; i++) {
		for(int j = head[i]; j != -1; j = e[j].nxt) {
			ta = i,tb = e[j].v;
			if(ta > tb) continue;
			cnt = 0;
			memset(vis,0,sizeof(vis));
			dfs(1);
			if(cnt == n) {
				bool flag = false;
				for(int k = 1; k <= n; k++) {
					if(ans[k] < now[k]) break;
					else if(ans[k] > now[k]) {
						flag = true;
						break;
					}
				}
				if(flag) {
					for(int k = 1; k <= n; k++) ans[k] = now[k];
				}
			}
		}
	}
	for(int i = 1; i <= n; i++) printf("%d",ans[i]);
	return 0;
}
2021/9/11 09:41
加载中...