Hamiltonian Cycle

时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
Given a directed graph containing n vertice (numbered from 1 to n) and m edges. Can you tell us how many different Hamiltonian Cycles are there in this graph?

A Hamiltonian Cycle is a cycle that starts from some vertex, visits each vertex (except for the start vertex) exactly once, and finally ends at the start vertex.

Two Hamiltonian Cycles C1, C2 are different if and only if there exists some vertex i that, the next vertex of vertex i in C1 is different from the next vertex of vertex i in C2.

输入
The first line contains two integers n and m. 2 <= n <= 12, 1 <= m <= 200.

Then follows m line. Each line contains two different integers a and b, indicating there is an directed edge from vertex a to vertex b.

输出
Output an integer in a single line – the number of different Hamiltonian Cycles in this graph.

提示
额外的样例:

样例输入 样例输出
3 3
1 2
2 1
1 3 0

样例输入
4 7
1 2
2 3
3 4
4 1
1 3
4 2
2 1
样例输出
2

#include "iostream"
#include "string.h"
using namespace std;

int n, m;
int edge[14];
int p[1 << 14];
int cnt = 0;

void dfs(int now, int unUsed)
{
    if(!unUsed)  //所有的结点都访问过
    {
        cnt += (edge[now] & 1);  //如果回到了结点1,edge[now]最右边是1
        return;
    }
    int rest = unUsed & edge[now];  //既没有访问过,结点now又可达
    while(rest)   //仍然有后继结点没有访问过
    {
        int tp = rest & (-rest);   //取出最右边的1,即取出一个后继且未访问过的结点
        dfs(p[tp], unUsed - tp);
        rest -= tp;    //从剩余未访问结点中除去
    }
}

int main()
{
    cin >> n;
    cin >> m;
    int i;
    for(i=0; i<n; i++)
        p[1 << i] = i + 1;  //p[1000] = 4,是为了方便访问结点
    memset(edge, 0, sizeof(edge));
    for(i=0; i<m; i++)
    {
        int u, v;
        cin >> u >> v;
        edge[u] |= 1 << (v - 1);  //edge[u]表示u的后继结点
    }
    int unUsed = (1 << n) - 2;  //因为从结点1开始遍历,所以将最右边的1减去
    dfs(1, unUsed);
    cout << cnt;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 7-1哈密顿回路是指一条经过图中所有顶点恰好一次的回路。在图论中,哈密顿回路是一个经典问题,其求解难度较大。对于一些特殊的图,如完全图和正则图,哈密顿回路的存在性已经得到了证明。但对于一般的图,目前还没有有效的算法可以在多项式时间内求解。 ### 回答2: 7-1 Hamiltonian cycle是指一个无向图中,经过每个点恰好一次的简单路径,称之为Hamiltonian cycle。如果一个无向图有Hamiltonian cycle,那么它就是一个Hamiltonian图。 Hamiltonian cycle问题是研究如何确定一个无向图中是否存在Hamiltonian cycle的问题,寻找这个问题的答案是计算机科学领域的一个重要课题。 目前,还没有发现一个可以解决所有情况的通用算法,这导致了这个问题的很多变种研究,例如,求解Hamiltonian路径和Hamiltonian环的问题,寻找最长、最短的Hamiltonian路径等等。此外,这个问题也引起了很多数学家的研究兴趣,他们试图证明这个问题的正确性。 虽然寻找一个图的Hamiltonian cycle问题是一个非常困难的问题,但已经被证明,当满足一定条件时,这个问题是可以在多项式时间内解决的。这个问题的关键在于如何确定判断是否存在Hamiltonian cycle的特征。 在实际应用中,Hamiltonian cycle问题与路线和规划问题有很大关联。例如,对于一些必须经过所有节点的计算机网络或路线规划问题,Hamiltonian cycle问题可以有效地应用于设计最优的路线方案。 总之,7-1 Hamiltonian cycle问题是一个非常重要的计算机科学问题,虽然该问题没有通用的解决方案,但已经有很多专家致力于解决这个问题,相信在未来,我们会找到更有效、更高效的算法来解决这个问题。 ### 回答3: 哈密顿回路是指一条经过图中每个顶点并且仅经过一次的闭合路径,其名称来源于爱尔兰数学家和物理学家威廉·哈密顿。这个概念是 NP 难问题之一,因此在复杂性理论的研究中受到广泛的关注。 在数学上,我们可以用一个图论的视角来理解哈密顿回路的概念。一个图是由一组顶点和它们之间的边构成的数学对象。如果一个图中存在一条经过所有顶点的路径,则称该图具有哈密顿路径。如果这条路径是闭合的,也就是说路径的最后一个顶点与第一个顶点相连,则称该图具有哈密顿回路。哈密顿回路是所有哈密顿路径的一类特殊情形,因为它可以被看作是一个哈密顿路径的起点和终点相同的特殊图。 从实际应用的角度来看,哈密顿回路的限制条件使其具有很高的计算复杂度。因为必须遍历到每个顶点,而且顶点只能经过一次,因此尝试找到一个图的哈密顿回路相当困难。实际上,对于一些有着特定的性质的图,哈密顿回路的存在问题可以使用一些算法解决。然而,对于大多数图而言,哈密顿回路的问题依然是难以解决的 NP 难问题。这种限制性质使得哈密顿回路成为了复杂性理论的重要研究领域之一。 总之,哈密顿回路是图论中的一个经典深度问题,其限制性质使得在实际应用中非常困难。然而,在理论研究中,在寻找哈密顿回路问题上的努力有助于对计算复杂度的理解和解决 NP 难问题提供新的视角和新的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值