30pts求助
查看原帖
30pts求助
523585
silent_ST楼主2024/6/8 22:58

rt,使用邻接表存图,已用并查集判连通。

#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5000;
vector<char> G[N];
int n, allmax, allmin = 1e5;
int deg[N], start, cnt = 0;
stack<char> ans;
bool vis[N][N];
char f[N];
char find(char x) {
	if(f[x] == x) return x;
	char t = find(f[x]);
	f[x] = t;
	return f[x];
}
void dfs(int now) {
	for(int i = 0; i < G[now].size(); i++) {
		if(!vis[now][G[now][i]] && !vis[G[now][i]][now]) {
			vis[now][G[now][i]] = 1;
			vis[G[now][i]][now] = 1;
			dfs(G[now][i]);
		}
	}
	ans.push(now);
}
int main() {
	for(int i = 64; i <= 125; i++) f[i] = i;
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		char u, v;
		char s[2];
		scanf("%s", &s);
		u = s[0];
		v = s[1];
		G[u].push_back(v);
		G[v].push_back(u);
		deg[u]++;
		deg[v]++;
		char xx = find(u), yy = find(v);
		f[xx] = yy;
	}
	for(int i = 64; i <= 125; i++) {
		if(f[i] == i && deg[i]) cnt++;
	}
	if(cnt != 1) {
		printf("No Solution\n");
		return 0;
	}
	cnt = 0;
	bool flag = false;
	for(int i = 64; i <= 125; i++) sort(G[i].begin(), G[i].end());
	for(int i = 64; i <= 125; i++) {
		if(deg[i] % 2 == 1) {
			if(!flag) start = i;
			cnt++;
		}
	}
	if(cnt > 0 && cnt != 2) {
		printf("No Solution\n");
		return 0;
	}
	if(!flag) {
		for(int i = 64; i <= 125; i++) {
			if(deg[i]) {
				start = i;
				break;
			}
		}
	}
	dfs(start);
	while(!ans.empty()) {
		char t = ans.top();
		printf("%c", t);
		ans.pop();
	}
	return 0;
}
2024/6/8 22:58
加载中...