【CF325E】The Red Button

本文探讨了在一个特殊的有向图中构造哈密顿回路的方法。该图由n个节点组成,每个节点向其两倍及两倍加一的节点连边。文章通过将问题转化为寻找欧拉回路来解决,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个n个点的图,标号0 ~ n-1,第i个点向2 * i和2 * i + 1连边,构造哈密顿回路。

首先发现n为奇数无解。考虑转换为欧拉回路,将2 * i 与2 * i + 1合并为一点,这样点就转化为边了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define Rep(i, x, y) for (int i = x; i <= y; i ++)
#define Dwn(i, x, y) for (int i = x; i >= y; i --)
#define RepE(i, x) for(int i = pos[x]; i; i = g[i].nex)
using namespace std;
typedef long long LL;
const int N = 200005;
struct Edge { int x, y, z, nex; } g[N * 2];
int n, m, pos[N], sz, p[N], ans[N], az; bool vis[N];
void Init(int x, int y, int z) { g[++ sz] = (Edge) { x, y, z, pos[x] }, pos[x] = sz; }
void Dfs(int x) {
	RepE(i, x) if (!vis[i]) {
		vis[i] = 1, Dfs(g[i].y), p[++ m] = i;
	}
}
int main()
{
	scanf ("%d", &n);
	if (n % 2) { puts("-1"); return 0; }
	Rep(i, 0, n / 2 - 1) Init(i, ((i * 4 % n) / 2 + 1) % (n/2), 1), Init(i, (i * 4 % n) / 2, 0);
	Dfs(0);
	Dwn(i0, m, 1) {
		int i = p[i0], x = g[i].x, y = g[i].y;
		ans[++ az] = 2 * x + g[i].z;
	}
	Rep(i, 1, az) printf("%d ", ans[i]);
	puts("0");

	return 0;
}


class ButtonDelegate(QStyledItemDelegate): def __init__(self, parent=None): super().__init__(parent) # self.target_row = 0 # 设置目标行索引(第1行) self.target_col = 10 # 设置目标列索引(第3列) def paint(self, painter, option, index): # if index.column() == self.target_col and CF_flag == 0: button_option = QStyleOptionButton() button_option.rect = option.rect.adjusted(4, 4, -4, -4) button_option.text = "解析" button_option.state = QStyle.StateFlag.State_Enabled QApplication.style().drawControl(QStyle.ControlElement.CE_PushButton, button_option, painter) 中的CF_flag怎么调用 def add_table_row(mainwindow, chn, trx, id, SendType, RemoteFlag, ExternFlag, length, data_hex, SID = -1, subFlag = "", time="-1", list_index = 0, CF_flag = 0): # print("CF_flag1:", CF_flag) print("list_index:", list_index) # #SID是10进制数字 #id是0X开头的16进制字符串 #获取新行的位置,table的行下标从0开始 if len(mainwindow.FilterIDList) == 0 or ( int(id, 16) in mainwindow.FilterIDList): time = get_now_time() #向data_hex后填充0,凑齐23个字符 # 将字符串分割成每两个字符一组 hex_list = data_hex.split() if len(hex_list[-1]) < 2: hex_list[-1] += "0" # 计算需要补充的组数 num_groups_to_add = 8 - len(hex_list) # 补充0到列表中 hex_list.extend(['00'] * num_groups_to_add) # 将列表重新组合成字符串,每组之间有一个空格 formatted_hex_str = ' '.join(hex_list) SID_str = hex(SID).upper()[2:] # #构造新行的内容 # items = [SID_str + " " + subFlag + CF_flag_str, time, chn, trx, id + " " + str(list_index), SendType, RemoteFlag, ExternFlag, length, formatted_hex_str] # new 0722 items = [SID_str + " " + subFlag, time, chn, trx, id + " " + str(list_index), SendType, RemoteFlag, ExternFlag, length, formatted_hex_str, ""] print("CF_flag2:", CF_flag) # CF_flag = 1 if CF_flag == 0: print("yes") print("CF_flag3:", CF_flag) # mainwindow.right_layout_object.table_view.setItemDelegateForColumn(10, ButtonDelegate()) mainwindow.delegate = ButtonDelegate(mainwindow.right_layout_object.table_view) mainwindow.right_layout_object.table_view.setItemDelegate(mainwindow.delegate) # 调用模型添加行 mainwindow.right_layout_object.model.add_row(items) mainwindow.right_layout_object.table_view.scrollToBottom() 中CF_flag的得到的变量
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值