图的广度度优先遍历算法运用队列主针对邻接表有向图

源代码如下:

#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20
typedef int EdgeData;
typedef char VertexData; //顶点数据域 

typedef struct node {  //  边表节点
     EdgeData cost; //边上d权值
     int adjvex;   //邻接点域
     struct node *next; //下一边链接指针
}EdgeNode;  

typedef struct {  //  顶点表
     VertexData vertex; //顶点数据域
     EdgeNode *firstEdge; // 边链表头指针
}VertexNode;  

typedef struct {  //  图的邻接表
     VertexNode verlist[MAX_VERTEX_NUM] ;
     int vexnum,edgenum; //顶点数和边数
}AdjGraph;  

//---------以上是图的邻接表数据结构------------------------//

typedef struct QUEUEnode* link;
struct QUEUEnode{
	int item ;
	link next;
};

static link head , tail;

link NEW(int item, link next){
	link x = new QUEUEnode ;
	x->item = item;
	x->next = next;
	return x;
}

void QUEUEinit(int maxN){
	head = NULL;
}

int QUEUEempty(){
	return head == NULL;
} 

void  QUEUEput(int item){
	if(head == NULL){
		head =(tail = NEW(item,head)) ;
		return;
	}
	tail->next = NEW(item,tail->next);
	tail = tail->next;
}

int QUEUEget(){
	int item = head->item;
	link t = head->next;
	delete head;
	head = t;
	return item;
} 

//--------------以上的队列的数据结构-----------------------// 

void printAdjGraph(AdjGraph G){
	cout<<"得到的有向图如下:"<<endl;
	int i ;
	for(i = 0;i<G.vexnum;i++){
		cout<<G.verlist[i].vertex<<"-->";
		EdgeNode *e = G.verlist[i].firstEdge;
		while(e!=NULL){
		cout<<e->adjvex<<"-->";
			e = e->next;
		}
		cout<<endl;
	}
}

//建立图的邻接表
AdjGraph createAdjGraph(AdjGraph G){
	int i,j,k,w;
	cout<<"输入顶点数和边数"<<endl;
	cin>>G.vexnum>>G.edgenum;
	cout<<"输入顶点信息"<<endl;
	for(i = 0 ; i<G.vexnum;i++){
		cin>>G.verlist[i].vertex;
		G.verlist[i].firstEdge = NULL; //将边表置为空表
	}
	EdgeData weight;
	int head;
	int tail;
	cout<<"输入第tail号边表的前端索引head,和权值weight,如(tail head weight)"<<endl;
	 for(k=0;k<G.edgenum;k++){
	 	cin>>tail>>head>>weight;
	 	EdgeNode *p = new EdgeNode;
	 	p->adjvex = head;
		p->cost = weight;
		p->next = G.verlist[tail].firstEdge;
		G.verlist[tail].firstEdge = p;    // 一条边是 tail---->head 

		//创建无向图的话就再加上下面的代码
//		p = new EdgeNode;
//	 	p->adjvex = tail;
//		p->cost = weight;
//		p->next = G.verlist[head].firstEdge;
//		G.verlist[head].firstEdge = p;
		if(k==G.edgenum-1)
			printAdjGraph(G);
	 }
	 return G;

}

bool visited[MAX_VERTEX_NUM] ;
int dfn[MAX_VERTEX_NUM]; //顶点的先深编号
int count = 1;
void BFS1(AdjGraph G,int K){
	int i;
	EdgeNode *p;
	QUEUEinit(40);
	cout<<G.verlist[K].vertex<<endl;
	visited[K] = true;
	QUEUEput(K);
	while(!QUEUEempty()){
		i = QUEUEget();
		p = G.verlist[i].firstEdge;
		while(p){
			if(!visited[p->adjvex]){
				cout<<G.verlist[p->adjvex].vertex<<endl;
				visited[p->adjvex] = true;
				QUEUEput(p->adjvex);
			}
			p = p->next;
		}
	} 

	//若是邻接矩阵则用下面的程序替代while(p)程序段
//	int j;
//	while(!QUEUEempty()){
//		i = QUEUEget();
//		for(j=0;j<G.vexnum;j++)
//			if(G.edge[i][j]==1 && !visited[j]){
//				cout<<G.verlist[j]<<endl;
//				visited[j] = true;
//				QUEUEput(j);
//			}
//	} 

	//---------以下是图的邻接矩阵数据结构-------------//
//#define MAX_VERTEX_NUM 20
//typedef int QElemType;
//typedef int EdgeData;
//typedef char VertexData;
//typedef struct
//{
//    VertexData verlist[MAX_VERTEX_NUM];            //顶点表
//     EdgeData edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵--可试为边之间的关系
//     int vexnum,edgenum;                          //顶点数和边数
//}MTGraph;

} 

//广度优先遍历主程序
void BFSTraverse(AdjGraph G){
	int i ;
	for(i=0;i<G.vexnum;i++)
		 visited[i]=false;
	for(i=0;i<G.vexnum;i++)
		if(!visited[i])
			BFS1(G,i);
} 

main(){
	AdjGraph G ;
	G = createAdjGraph(G);
	cout<<"广度优先遍历的结果:"<<endl;
	BFSTraverse(G);
	system("pause");
}

程序运行结果图
<img src="http://img.blog.csdn.net/20150815100702960?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 08:56:09

图的广度度优先遍历算法运用队列主针对邻接表有向图的相关文章

算法8:巧妙的邻接表(数组实现)

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,如今我来介绍第二种存储图的方法:邻接表,这样空间和时间复杂度就都是M. 对于稀疏图来说,M要远远小于N2. 先上数据.例如以下. 1 2 3 4 5 6 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行两个整数n m. n表示顶点个数(顶点编号为1~n),m表示边的条数.接下来m行表示,每行有3个数x y z.表示顶点x到顶点y的边的权值为z.下图就是一种使用链表来实现邻接表的方法. 上面这样的实现方法为图

【数据结构-图】图的建立以及广度优先遍历算法

本文利用邻接表的方法将图进行了表示,并且利用广度优先遍历方法对图进行遍历 下面是一个图的示例: 代码如下: #include<iostream> using namespace std; typedef int VexType; typedef struct Arcnode{ VexType data; struct Arcnode *nextarc; }ArcNode; typedef struct Vexnode { VexType data; ArcNode *firstarc; }Vn

Java实现图的深度和广度优先遍历算法

概述: 近期要学习写网络爬虫.所以把图的深度和广度搜索都再温习一下. 图结构展示: 实现过程: 首先,我们来看看图结构在代码中的实现.有三块逻辑: 1.图中的节点: public class GraphNode { public List<GraphEdge> edgeList = null; private String label = ""; public GraphNode(String label) { this.label = label; if (edgeLis

宽度优先遍历爬虫的python实现

爬虫 宽度优先遍历 python 网上很著名的一本爬虫教程<自己手动写网络爬虫>,该书所有源码是用java编写的, 其中提到了宽度优先遍历算法,闲来无事我把他用python实现了一遍.代码量少了将近一半,呵呵. 宽度优先算法介绍 参考:http://book.51cto.com/art/201012/236668.htm 整个的宽度优先爬虫过程就是从一系列的种子节点开始,把这些网页中的"子节点"(也就是超链接)提取出来,放入队列中依次进行抓取.被处理过的链接需要放 入一张表

图基本算法 最小生成树 Prim算法(邻接表+优先队列STL)

这篇文章是对<算法导论>上Prim算法求无向连通图最小生成树的一个总结,其中有关于我的一点点小看法. 最小生成树的具体问题可以用下面的语言阐述: 输入:一个无向带权图G=(V,E),对于每一条边(u, v)属于E,都有一个权值w. 输出:这个图的最小生成树,即一棵连接所有顶点的树,且这棵树中的边的权值的和最小. 举例如下,求下图的最小生成树: 这个问题是求解一个最优解的过程.那么怎样才算最优呢? 首先我们考虑最优子结构:如果一个问题的最优解中包含了子问题的最优解,则该问题具有最优子结构. 最小

本周学习的代码(数构 深度 广度 优先遍历)

深度优先遍历代码: #include "stdafx.h" #include <stdio.h> #include <string.h> #define MVNum 100          //最大顶点数 typedef int InfoType;              //边的权值类型 typedef char*  VexType;          //顶点数据类型 typedef struct LinkNode{     //边结点 int adjv

图的邻接表表示、广度优先、深度优先搜索

图,就是我们在数据结构中学到的图,它是一种存储信息的结构.图是一类在实际应用中非常常见的数据结构,当数据规模大到一定程度时,如何对其进行高效计算即成为迫切需要解决的问题.最常见的大规模图数据的例子就是互联网网页数据,网页之间通过链接指向形成规模超过500 亿节点的巨型网页图.再如,Facebook 社交网络也是规模巨大的图,仅好友关系已经形成超过10 亿节点.千亿边的巨型图,考虑到Facebook 正在将所有的实体数据节点都构建成网状结构,其最终形成的巨型网络数据规模可以想见其规模.要处理如此规

Prime算法求最小生成树 (邻接表)

/* Name: Prime算法求最小生成树 (邻接表) Copyright: Author: 巧若拙 Date: 25/11/14 13:38 Description: 实现了 Prime算法求最小生成树 (邻接表)的普通算法和最小堆优化算法. */ #include<stdio.h> #include<stdlib.h> #define MAX 2000   //最大顶点数量 #define INFINITY 999999   //无穷大 typedef int VertexT

邻接表的深度优先遍历

转载请注明出处http://www.cnblogs.com/hslzju 对<大话数据结构>P241——邻接表的深度优先遍历,进行了自己的理解并完善了代码. 邻接矩阵的深度优先遍历见http://www.cnblogs.com/hslzju/p/5399249.html 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接表的存储结构创建该图,再进行深度优先遍历.代码和解释如下(Qt Creator测试通过): 1 #include <iostream> 2 #include &