哈密顿

哈密顿绕行世界问题—— HDU - 2181

本秂侑毒 提交于 2020-03-08 22:24:49
原题链接 Vjudge 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。 Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output Sample Input 2 5 20 1 3 12 2 4 10 3 5 8 1 4 6 5 7 19 6 8 17 4 7 9 8 10 16 3 9 11 10 12 15 2 11 13 12 14 20 13 15 18 11 14 16 9 15 17 7 16 18 14 17 19 6 18 20 1 13 19 5 0 Sample Output 1: 5 1 2 3 4 8 7 17 18 14 15 16 9 10 11 12 13 20 19 6 5 2: 5 1 2 3 4 8 9 10 11 12 13 20 19 18 14 15 16 17 7 6 5 3: 5 1 2 3 10 9 16 17 18 14 15 11 12 13 20 19 6 7 8 4 5 4: 5 1

算分-NP COMPLETENESS

雨燕双飞 提交于 2020-02-12 14:46:03
Easy and Hard Problems:   NP完全理论是为了在可处理的问题和不可处理的问题之间画一条线,目前最重要的问题是是否这两者是本质不同的,而这个问题目前还没有被解决。典型的结果是一些陈述,比如“如果问题B有一个多项式时间的算法,那么C也会有一个多项式时间的算法”,或者逆否表述为“如果C没有多项式时间的算法,那么B也没有”。第二个表述是说,对于一些问题C以及一个新的问题B,我们先去找是否有这种关系,如果有的话我们可能不想去做问题B,先来看看C。为了描述这些东西,需要不少形式主义的记号,我们在这里尽可能地少涉及。   先来看什么是问题?一个抽象的做决定问题是从问题实例集合I到{0,1}的映射,其中0代表错误,1代表正确。为了更严谨,我们把问题实例写成I到{0,1}*,也就是0/1组成的字符串,一个具体的做决定问题是从比特串到{0,1}的映射,我们把那些没有意义的问题映射到0。举个例子来说,对于最短路径问题,一个问题事实例是一个图以及两个顶点,做决定的问题是是否存在这两个顶点之间长度至多为k的一条路径。要注意的是,做决定问题不会比相应的最优算法要复杂,也就是说其复杂度小于等于最优算法,因此为了去证明相应的最优化算法是hard的,如果我们可以证明做决定问题是hard的,那么就可以达成我们的目标。(相当于充分性)   接着来看什么是多项式时间

luogu P4233 射命丸文的笔记

只愿长相守 提交于 2020-02-11 00:02:08
题目 题意:给出 \(n\) ,在 有哈密顿回路的 \(n\) 个点的竞赛图中等概率选出一个,求哈密顿回路个数的期望。 答案就是 哈密顿回路的总条数 除以 有哈密顿回路的竞赛图的个数。 哈密顿回路的总条数是很好求的,对每个环算贡献,算出 \((n-1)!2^{C_n^2-n}\) 。 有哈密顿回路的竞赛图的个数,这个有点难办。 结论:一个竞赛图有哈密顿回路 的充要条件是 它强连通。 必要性显然,简单证证充分性。(如果假了或者有更好的证法请告诉我qwq) 归纳证明。对于点数很小的情况,容易验证是对的。现在假设已经证明了点数在 \(n-1\) 以内时结论是对的。 假设去掉 \(n\) 号点,这时图仍是竞赛图但不一定强连通,此时图中有若干个强连通分量。 把强连通分量缩点变成拓扑图后,显然拓扑序是唯一的,设为 \((S_1\rightarrow S_2\rightarrow \cdots\rightarrow S_k)\) ,其中 \(S_i\) 为一个强连通分量。 因为要强连通, \(n\) 和 \(S_1\) 之间有至少一条边方向是 \((n\rightarrow S_1)\) ,而 \(n\) 和 \(S_k\) 之间有至少一条边方向是 \((S_k\rightarrow n)\) 。 由于 \(S_i\) 的点数 \(|S_i|\) 小于 \(n\)

HDU 2181 哈密顿绕行世界问题

南笙酒味 提交于 2020-02-08 17:35:12
题目描述: 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。 Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output Sample Input 2 5 20 1 3 12 2 4 10 3 5 8 1 4 6 5 7 19 6 8 17 4 7 9 8 10 16 3 9 11 10 12 15 2 11 13 12 14 20 13 15 18 11 14 16 9 15 17 7 16 18 14 17 19 6 18 20 1 13 19 5 0 Sample Output 1: 5 1 2 3 4 8 7 17 18 14 15 16 9 10 11 12 13 20 19 6 5 2: 5 1 2 3 4 8 9 10 11 12 13 20 19 18 14 15 16 17 7 6 5 3: 5 1 2 3 10 9 16 17 18 14 15 11 12 13 20 19 6 7 8 4 5 4: 5 1 2 3 10

HOJ 1181 变形课

 ̄綄美尐妖づ 提交于 2020-01-28 12:59:51
本题测试数据看到过的博客都说比较水,我也没多想,直接用了一个麻烦的方法,用stack实现。这是因为我把这个题目跟”哈密顿绕行世界问题“这个题比较了一下,发现两个题非常相似,相比之下本题更为简单,于是用了相同的思路。 可以比较一下: HOJ 2181 哈密顿绕行世界问题 # include <iostream> # include <stack> # include <cstring> # include <string> # pragma (disable:4996) using namespace std ; const int N = 26 ; int flag , a [ N ] [ N ] , vis [ N ] ; void dfs ( stack < int > & S , int k ) { if ( S . top ( ) == 'm' - 'a' ) { flag = 1 ; } for ( int i = 0 ; i < N ; i ++ ) if ( i != k && vis [ i ] == 0 && a [ k ] [ i ] == 1 ) { S . push ( i ) ; vis [ i ] = 1 ; dfs ( S , i ) ; S . pop ( ) ; } } int main ( ) { char cc [ 30 ] ; stack <