【数据结构/C语言版】【图】基于邻接矩阵和邻接表的BFS

BFS广度优先搜索

广搜类似于二叉树的层序遍历,利用队列先进先出的性质扩充一个结点相邻的所有结点,为了避免重复搜索通常对搜过的结点进行标记,入队时进行标记可以避免重复入队。利用之前敲过的队列辅助完成广搜。
队列:

#define QElemType int
#define Status int
#define MAXQSIZE 100

typedef struct {
	QElemType* base;
	int front;
	int rear;
}SqQueue;

Status InitQueue(SqQueue& Q)
{
	Q.base = (QElemType*)malloc(sizeof(QElemType) * MAXQSIZE);
	if (!Q.base)
		exit(-1);
	Q.front = Q.rear = 0;
	return 1;
}

Status QueueEmpty(SqQueue Q)
{
	if (Q.front == Q.rear)
		return 1;
	return 0;
}

Status DestroyQueue(SqQueue& Q)
{
	while (!QueueEmpty(Q)) {
		free(&Q.base[Q.front]);
		Q.front = (Q.front + 1) % MAXQSIZE;
	}
	return 1;
}

int QueueLength(SqQueue Q)
{
	return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

Status ClearQueue(SqQueue& Q)
{
	if (QueueEmpty(Q))
		return 0;
	int len = QueueLength(Q);
	while (len--) {
		Q.base[Q.front] = 0;
		Q.front = (Q.front + 1) % MAXQSIZE;
	}
	Q.front = Q.rear = 0;
	return 1;
}

Status GetHead(SqQueue Q, QElemType& e)
{
	if (QueueEmpty(Q))
		return 0;
	e = Q.base[Q.front];
	return 1;
}

Status EnQueue(SqQueue& Q, QElemType e)
{
	if ((Q.rear + 1) % MAXQSIZE == Q.front)
		return 0;
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXQSIZE;
	return 1;
}

Status DeQueue(SqQueue& Q, QElemType& e)
{
	if (QueueEmpty(Q))
		return 0;
	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXQSIZE;
	return 1;
}

void visit(QElemType e)
{
	cout << e << ' ';
}

测试数据:

3
4 4
1
2
3
4
1 4
5
2 4
6
1 3
7
2 3
5

测试输出:

0
2
3
1

邻接矩阵链接
邻接表链接
基于邻接矩阵广搜:

bool vis[MAX_VERTEX_NUM];
//bfs每次入队时输出并标记已经访问 
//0 2 3 1 
void bfs(MGraph G,int s) 
{
	SqQueue q;
	InitQueue(q);
	EnQueue(q,s);
	cout<<s<<endl;
	vis[s]=1;
	while(!QueueEmpty(q))
	{
		int u;
		DeQueue(q,u);
		for(int i=0;i<G.vexnum;i++){
			if(G.arcs[u][i].adj != INFINITY && !vis[i]){
				EnQueue(q,i);
				cout<<i<<endl;
				vis[i] = 1;
			}
		}
	}
}

基于邻接表广搜:

bool vis[MAX_VERTEX_NUM];
//bfs每次入队时输出并标记已经访问 
//0 2 3 1 
void bfs(ALGraph G, int s)
{
	SqQueue q;
	InitQueue(q);
	EnQueue(q, s);
	cout << s << endl;
	vis[s] = 1;
	while (!QueueEmpty(q))
	{
		int u;
		DeQueue(q, u);
		ArcNode* p = G.vertices[u].firstarc->nextarc;
		while (p != NULL) {
			int v = p->adjvex;
			if (!vis[v]) {
				EnQueue(q, v);
				cout << v << endl;
				vis[v] = 1;
			}
			p = p->nextarc;
		}
	}
}

你可能感兴趣的:(数据结构,算法,数据结构,BFS,图)