广度优先,使用队列,在网上下的关于队列的代码将数据节点改成本部分需要的结构。
#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;
}