哈密尔顿回路 状压求调(悬关)
  • 板块学术版
  • 楼主Double_Sheep
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/24 12:57
  • 上次更新2024/10/24 15:30:41
查看原帖
哈密尔顿回路 状压求调(悬关)
838570
Double_Sheep楼主2024/10/24 12:57

rt,挂了2个点,没有具体数据,但正确的输出都不是无解.

拜谢qwq

样例输入:

3 3
1 2
2 3
3 1

样例输出:

1 2 3

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 25, M = (1 << 20) + 5;
int n, m, lst[M];
bool e[N][N], dp[M];
vector<int> Ans;
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	if (n == 1) cout << "1\n", exit(0);
	for (int i = 1; i <= m; i++) {
		int u, v; cin >> u >> v;
		e[u][v] = 1;
	}
	for (int s = 1; s <= n; s++) {
		memset(dp, 0, sizeof(dp)), memset(lst, -1, sizeof(lst));
		lst[0] = s;
		for (int i = 0; i < (1 << n); i++) {
			if (lst[i] == -1) continue;
			int j = lst[i];
			for (int k = 1; k <= n; k++) {
				if (!e[j][k] || ((i >> (k - 1)) & 1)) continue;
				if (__builtin_popcount(i) < n - 1 && k == s) continue;
				dp[i ^ (1 << (k - 1))] = 1, lst[i ^ (1 << (k - 1))] = k;
			}
		}
		if (dp[(1 << n) - 1]) {
			int i = (1 << n) - 1;
			while (__builtin_popcount(i))
				Ans.push_back(lst[i]), i ^= (1 << (lst[i] - 1));
			for (int j = Ans.size() - 1; j >= 0; j--) cout << Ans[j] << ' ';
			return 0;
		}
	}
	cout << "No Answer\n";
	return 0;
}
2024/10/24 12:57
加载中...