哈密顿环之广度优先

本文介绍了一个使用广度优先搜索(BFS)算法来寻找汉密尔顿回路的方法。该算法利用队列实现,并通过判断顶点是否已访问来避免重复路径,最终找到从起始点出发并返回的完整回路。

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

广度优先,使用队列,在网上下的关于队列的代码将数据节点改成本部分需要的结构。

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include"Queue.h"

#define MAX_SIZE 21

/*struct Point{
int vertex;
int path[MAX_SIZE];
int length;
};*/
//通过广度优先得到的回路
void getHamiltonPathBybreath(int graph[MAX_SIZE][MAX_SIZE],int len,struct Point* vertex);

//判断某点是否在此路径中被访问
int isVisited(int vertex,struct Point p);

void HamiltonBybreath()
{
    int len,i,j;//len为点数
    int graph[MAX_SIZE][MAX_SIZE];//邻接矩阵
    struct Point vertex;
    //double start,end;//时间变量

    // CPU频率
    LARGE_INTEGER li;
    // 记录过程时间
    LONGLONG start,end,fred;
    // 获取CPU频率
    QueryPerformanceFrequency(&li);
    fred = li.QuadPart;

    freopen("input.txt","r",stdin);
    freopen("outputbybreath.txt","w",stdout);
    //
    while(scanf("%d",&len)!=EOF)
    {
        //初始化
        for(i=0; i<len; i++)
        {
            for(j=0; j<len; j++)
                scanf("%d",&graph[i][j]);
        }

        //start = GetTickCount();
         QueryPerformanceCounter(&li);
        start = li.QuadPart;
        vertex.vertex = 0;
        vertex.path[0] = 0;
        vertex.length = 1;
        getHamiltonPathBybreath(graph,len,&vertex);
        if(vertex.length == len)
            printVertex(vertex.path,len);
        else
            printf("否\n");
        //end = GetTickCount();
        //printf("经历时间为%.2f\n\n",end-start);
        QueryPerformanceCounter(&li);
        end = li.QuadPart;
         // 计算持续时间(us)
        printf("经历时间为%dms\n\n",(int)1000 * (end-start) / fred);
    }
}

void getHamiltonPathBybreath(int graph[MAX_SIZE][MAX_SIZE],int len,struct Point* vertex)
{
    int i,j;
    struct Queue* q;
    struct Point p,p1;
    q = InitQueue();//建立队列
    EnQueue(q,*vertex);//入队列
    while(!IsEmpty(q))//检查队列是否为空
    {
        DeQueue(q,&p);//出队列
        if(p.length == len && graph[p.vertex][vertex->vertex])
        {
            *vertex = p;
            return;
        }
        for(i=0; i<len; i++)
        {
            if(!isVisited(i,p) && graph[p.vertex][i])
            {
                p1.vertex = i;
                for(j=0; j<p.length; j++)
                    p1.path[j] = p.path[j];
                p1.path[j] = i;
                p1.length = p.length + 1;
                EnQueue(q,p1);
            }
        }
    }
    return;
}

int isVisited(int vertex,struct Point p)
{
    int i;
    for(i=0; i<p.length; i++)
        if(p.path[i] == vertex)
            return 1;
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值