码迷,mamicode.com
首页 > 其他好文 > 详细

哈密顿图的判定

时间:2018-02-10 20:09:52      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:algo   image   exp   str   tchar   target   name   amp   ati   

推荐学习资料:

http://www.cnblogs.com/Ash-ly/p/5452580.html

http://ylroki.blog.163.com/blog/static/162978871201032775322518/

https://wenku.baidu.com/view/38dd0d4714791711cd791725.html

一、定义

通过图G的每个节点一次,且仅一次的通路称为哈密顿通路

通过图G的每个节点一次,且仅一次的回路称为哈密顿回路

含有哈密顿回路的图称为哈密顿图

 

二、性质与判定

摘自:https://wenku.baidu.com/view/38dd0d4714791711cd791725.html

技术分享图片

 

技术分享图片

 

技术分享图片

 

三、构造

摘自:http://ylroki.blog.163.com/blog/static/162978871201032775322518/

技术分享图片

 

四、代码

输出哈密顿图的一条哈密顿回路

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

#define N 401

int n,m;

bool e[N][N];

int cnt,s,t;
bool vis[N];
int ans[N];

void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-0; c=getchar(); }
}

void Reverse(int i,int j)
{
    while(i<j) swap(ans[i++],ans[j--]);
}

void expand()
{
    while(1)
    {
        int i;
        for(i=1;i<=n;++i)
            if(e[t][i] && !vis[i])
            {
                ans[++cnt]=t=i;
                vis[i]=true;
                break;
            }
        if(i>n) return;
    }
}

void Hamilton()
{
    memset(vis,false,sizeof(vis));
    cnt=0;
    s=1;
    for(t=1;t<=n;++t)
        if(e[s][t]) break;
    vis[s]=vis[t]=true;
    cnt=2;
    ans[1]=s;
    ans[2]=t;
    while(1)
    {
        expand();
        Reverse(1,cnt);
        swap(s,t);
        expand();
        if(!e[s][t])
        {
            int i;
            for(i=2;i<cnt;++i)
                if(e[ans[i]][t] && e[s][ans[i+1]]) break;
            t=ans[i+1];
            Reverse(i+1,cnt);
        }
        if(cnt==n) break;
        int j,i;
        for(j=1;j<=n;++j)
            if(!vis[j])
            {
                for(i=2;i<cnt;++i)
                    if(e[ans[i]][j]) break;
                if(e[ans[i]][j]) break;
            }
        s=ans[i-1];
        Reverse(1,i-1);
        Reverse(i,cnt);
        ans[++cnt]=j;
        t=j;
        vis[j]=true;
    }
    for(int i=1;i<=cnt;++i) printf("%d ",ans[i]);
    printf("%d\n",ans[1]);
}

int main()
{
    int u,v;
    while(1)
    {
        read(n); read(m);
        if(!n) return 0;
        memset(e,false,sizeof(e));
        while(m--)
        {
            read(u); read(v);
            e[u][v]=e[v][u]=true;
        }
        Hamilton();
    }
}

 

哈密顿图的判定

标签:algo   image   exp   str   tchar   target   name   amp   ati   

原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8439160.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!