首页 > 其他分享 >7824. 【2023.07.20NOI模拟】哈密顿路

7824. 【2023.07.20NOI模拟】哈密顿路

时间:2023-07-21 09:45:14浏览次数:44  
标签:le 哈密顿 路径 点集 枚举 2023.07 20NOI 起点 7824

Description

大家最喜欢的典中典环节它来了。

在图论中,无向图的哈密顿路径是恰好能将图中所有顶点各访问一次的路径。

给定一张 \(n\) 个点的简单无向图。对于每个 \(1 \leq x, y \leq n(x \neq y)\),你想要知道,是否存在一条以顶点 \(x\) 为起点, 以顶点 \(y\) 为终点的哈密顿路径。

\(2\%\) 的数据,\(n\le 9\)。

\(38\%\) 的数据,\(n\le 19\)。

\(100\%\) 的数据,\(n\le 24\)。

Solution

\(2\%\) 数据

设布尔数组 \(f_{s,i,j}\) 表示起点为 \(i\),当前点为 \(j\),经过的点集为 \(s\) 的情况是否存在。

转移枚举起点,然后枚举当前点 \(j\) 和点集 \(s\),再枚举 \(k\) 表示从 \(k\) 到 \(j\)。则,\(f_{s,i,j}=f_{s-2^{j-1},i,k}\)。

时间复杂度 \(\mathcal O(2^nn^3)\)。

\(38\%\) 数据

\(f\) 开成布尔类型太亏了,设 \(f_{s,i}\) 表示当前点为 \(i\),点集为 \(s\) 的可能起点(通过二进制来对应)。

初始时 \(f_{2^{i-1},i}=2^{i-1}\),枚举点集 \(s\) 和当前点 \(i\),再枚举点 \(j\) 表示从 \(j\) 转移到 \(i\)。\(f_{s,i}|=f_{s-2^{i-1},j}\)。

时间复杂度 \(\mathcal O(2^nn^2)\)。注意空间。

\(100\%\) 数据

多个起点不太优秀,考虑优化。

根据哈密顿路径的定义,节点 1 一定在路径上。同时我们可以将路径 \(x\rightarrow y\) 变成 \(1\rightarrow x\) 和 \(1\rightarrow y\)。

设 \(f_s\) 表示从 1 开始,经过点集为 \(s\) 的点,最后可能停在哪些点。记 \(g_i\) 表示能到达点 \(i\) 的点。转移则枚举 \(s\) 和当前点 \(i\),那么 \(i\) 能作为终点,当且仅当存在 \(j\in f_{s-2^{i-1}}\) 且 \(j\in g_i\),即 \(f_{s-2^{i-1}} \text{ and } g_i\not=0\)。

统计答案则根据 Meet in the Middle 的想法,枚举 \(S\),则\(T=U-S\)(\(U\) 是全集)。再枚举 \(i\in S\),用 \(f_T\) 去更新 \(i\) 的答案。

时间复杂度 \(\mathcal O(2^nn)\)。

Code

#include<cstdio>
#include<cstring>
#define N 30
#define MX (1<<24)+5
using namespace std;
int n,f[MX],g[N],ans[N];
char ch[N];
int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;++i)
    {
        scanf("%s",ch+1);
        for (int j=1;j<=n;++j)
            if ((ch[j]-'0')==1) g[j]+=1<<(i-1);
    }
    f[1]=1;
    for (int s=2;s<(1<<n);++s)
    {
        for (int i=1;i<=n;++i)
            if (s&(1<<(i-1)))
            {
                int ss=s^(1<<(i-1));
                if (f[ss]&g[i]) f[s]+=1<<(i-1);
            }
    }
    ans[1]=f[(1<<n)-1];
    for (int s=1;s<(1<<n);s+=2)
    {
        int t=((1<<n)-1)^s;
        for (int i=2;i<=n;++i)
            if (f[s]&(1<<(i-1)))
                ans[i]|=f[t|1];
    }
    for (int i=1;i<=n;++i)
    {
        for (int j=1;j<=n;++j)
            if (ans[i]&(1<<(j-1))) printf("1");
            else printf("0");
        printf("\n");
    }
    return 0;
}

标签:le,哈密顿,路径,点集,枚举,2023.07,20NOI,起点,7824
From: https://www.cnblogs.com/Livingston/p/17570427.html

相关文章

  • 【2023.07.20】成为渣男
    在约会了那么多女生后,我的内心逐渐趋向于平静,内心也不再痛苦了我对现在的女生是很失望的,好像每个人都是享乐主义我不是说享乐主义不好,但是她们给我的感受就是“这世上只有玩才是最重要的,抛弃了一切的责任和义务,只顾着自己开心就好”为什么失业了可以心安理得的啃老,为什么在花......
  • Day12(2023.07.19)
    行程9:00到达上海电气集团数字科技有限公司(闵行区合川路2555号2号楼)9:30  听老师与公司负责人交谈11:30--13:00   吃饭休息13:30  听老师与公司负责人交谈15:00         实践windows安全检测16:30     ......
  • 【2023.07.18】Keeppley栖云小筑K18002建筑积木评测
    前言本人是自费购买积木,购买原因是给妹妹培养动手能力,减少短视频占用时间,其次是给家里做摆饰,所以选择积木多考虑了美观非专业评测,如果想看更多积木评测请点进我的博客主页分类查看正文这是第一次拼大型建筑类的积木灯光件的设计不是很喜欢,需要把单层拆下来,然后将那个开关积......
  • Day11(2023.07.18)
    行程8:45    到达上海市信息安全测评认证中心(黄浦区陆家浜路1308号)9:00  改文件11:30--13:00   吃饭休息13:00 创建项目,熟悉软件,生成报告等..17:00      下班......
  • 【2023.07.17】牛客&第四范式多校Day1(华中科技大学Round)过题小记
    D-Chocolate(博弈论)12分钟过题。签到。K-Subdivision(图论、搜索)1小时21分过题,签到。如果给定的是一棵树的话,新增的点一定位于连接叶子节点的那条边上、否则就是已有的点。然而这是一张图,所以我们可以使用\(\ttbfs\)将其近似的转化为一棵树:当某个点(非其父节点)被第二次遍历......
  • 【2023.07.16】清华&字节夏令营资格赛(Tsinghua University Bootcamp. Qualification R
    B-Performance(贪心、排序)23分过题。打卡题,差分+排序。A-CodeLock(图论、搜索)37分由队友单人过题。打卡题,将序列转化为图上问题,随后维护每一个环上相同元素的距离。D-CompanyNetwork(树论、倍增、数据结构)2小时55分全队一起过题。中等难度,对于每一个节点,倍增向上搜索其......
  • 【2023.07.14】Atcoder:past201912 - 第一回 アルゴリズム実技検定(div4+区域赛难度)过题
    G-Division解法一:位运算+状压枚举(赛时思路)范围显然,可以跑\(2^n\)的算法,考虑位运算状态压缩。以\(\mathcalO(2^n\cdot2^n)\)的复杂度分别枚举位于第一组、第二组中的人,随后计算每一种分组的快乐值,代码较长,赛时敲了半个小时,不过好在一发过了。总结:其实代码里面的剪枝完......
  • 【2023.07.17】keeppley周杰伦DZ0157周同学积木评测
    前言本人是自费购买积木,购买原因是给妹妹培养动手能力,减少短视频占用时间,其次是给家里做摆饰,所以选择积木多考虑了美观非专业评测,如果想看更多积木评测请点进我的博客主页分类查看正文这次的说明书颜色真的印刷质量感觉不太好(单指颜色,拼装过程说明还是很不错的),颜色真的很杂......
  • 2023.07.16 高质量 NOIP 模拟赛题解
    HDU5719Arrange【模拟】给定数列\(B_n,C_n\),求出满足\[B_i=\min_{j=1}^i\{A_j\},\quadC_i=\max_{j=1}^i\{A_j\}\]的排列\(A\)的数量。维护每个位置可能的数字数量,然后乘法原理即可。代码:http://acm.hdu.edu.cn/viewcode.php?rid=38654445。HDU5807KeepInTouch......
  • Day09(2023.07.14)
    行程8:45    到达上海市信息安全测评认证中心(黄浦区陆家浜路1308号)9:00  学习软件测评工具11:30--13:00   吃饭休息13:00  学习软件测评工具17:00      下班......