图--邻接表(建立、深搜、广搜)
来源:互联网 发布:易语言软件下载 编辑:程序博客网 时间:2024/04/30 02:22
博客地址:
http://blog.csdn.net/akof1314/article/details/4388722
/************************************************************************//* 图的邻接表存储结构 *//************************************************************************/#include <stdio.h>#define MaxVertexNum 100#define QueueSize 30typedef enum{FALSE,TRUE}Boolean;Boolean visited[MaxVertexNum];typedef char VertexType;typedef int EdgeType;typedef struct node//边表结点{int adjvex;//邻接点域struct node *next;//域链//若是要表示边上的权,则应增加一个数据域}EdgeNode;typedef struct vnode//顶点边结点{VertexType vertex;//顶点域EdgeNode *firstedge;//边表头指针}VertexNode;typedef VertexNode AdjList[MaxVertexNum];//AdjList是邻接表类型typedef struct{AdjList adjlist;//邻接表int n,e;//图中当前顶点数和边数}ALGraph;//对于简单的应用,无须定义此类型,可直接使用AdjList类型/************************************************************************//* 建立无向图的邻接表算法 *//************************************************************************/void CreateGraphAL (ALGraph *G){ int i,j,k; EdgeNode * s; printf("请输入顶点数和边数(输入格式为:顶点数,边数):/n"); scanf("%d,%d",&(G->n),&(G->e)); // 读入顶点数和边数 printf("请输入顶点信息(输入格式为:顶点号<CR>)每个顶点以回车作为结束:/n"); for (i=0;i<G->n;i++) // 立有n个顶点的顶点表 { scanf("/n%c",&(G->adjlist[i].vertex)); // 读入顶点信息 G->adjlist[i].firstedge=NULL; // 点的边表头指针设为空 } printf("请输入边的信息(输入格式为:i,j):/n"); for (k=0;k<G->e;k++) // 建立边表 { scanf("/n%d,%d",&i,&j); // 读入边<Vi,Vj>的顶点对应序号 s=new EdgeNode; // 生成新边表结点s s->adjvex=j; // 邻接点序号为j s->next=G->adjlist[i].firstedge; // 将新边表结点s插入到顶点Vi的边表头部 G->adjlist[i].firstedge=s;s=new EdgeNode;s->adjvex=i;s->next=G->adjlist[j].firstedge;G->adjlist[j].firstedge=s; }}/************************************************************************//* 深度优先遍历 *//************************************************************************/void DFS(ALGraph *G,int i){ //以vi为出发点对邻接表表示的图G进行深度优先搜索 EdgeNode *p;printf("visit vertex:%c/n",G->adjlist[i].vertex); // 访问顶点vivisited[i]=TRUE; //标记vi已访问p=G->adjlist[i].firstedge; //取vi边表的头指针while(p){//依次搜索vi的邻接点vj,这里j=p->adjvexif (!visited[p->adjvex])//若vi尚未被访问DFS(G,p->adjvex);//则以Vj为出发点向纵深搜索p=p->next; //找vi的下一邻接点}}void DFSTraverseM(ALGraph *G){ int i; for(i=0;i<G->n;i++) visited[i]=FALSE; for(i=0;i<G->n;i++) if(!visited[i]) DFS(G,i);}/************************************************************************//* 广度优先遍历 *//************************************************************************/typedef struct{ int front; int rear; int count; int data[QueueSize];}CirQueue;void InitQueue(CirQueue *Q){ Q->front=Q->rear=0; Q->count=0;}int QueueEmpty(CirQueue *Q){ return Q->count=QueueSize;}int QueueFull(CirQueue *Q){ return Q->count==QueueSize;}void EnQueue(CirQueue *Q,int x){ if (QueueFull(Q)) printf("Queue overflow"); else { Q->count++; Q->data[Q->rear]=x; Q->rear=(Q->rear+1)%QueueSize; }}int DeQueue(CirQueue *Q){ int temp; if(QueueEmpty(Q)) { printf("Queue underflow"); return NULL; } else { temp=Q->data[Q->front]; Q->count--; Q->front=(Q->front+1)%QueueSize; return temp; }}void BFS(ALGraph*G,int k){// 以vk为源点对用邻接表表示的图G进行广度优先搜索 int i;CirQueue Q;//须将队列定义中DataType改为intEdgeNode *p;InitQueue(&Q);//队列初始化printf("visit vertex:%c/n",G->adjlist[k].vertex);//访问源点vkvisited[k]=TRUE;EnQueue(&Q,k);//vk已访问,将其人队。(实际上是将其序号人队)while(!QueueEmpty(&Q)){//队非空则执行i=DeQueue(&Q);//相当于vi出队p=G->adjlist[i].firstedge;//取vi的边表头指针while(p){//依次搜索vi的邻接点vj(令p->adjvex=j)if(!visited[p->adjvex]){//若vj未访问过printf("visit vertex:%c",G->adjlist[p->adjvex].vertex);//访问vjvisited[p->adjvex]=TRUE;EnQueue(&Q,p->adjvex);//访问过的vj人队}p=p->next;//找vi的下一邻接点}}}void BFSTraverseM(ALGraph *G){ int i; for (i=0;i<G->n;i++) visited[i]=FALSE; for (i=0;i<G->n;i++) if (!visited[i]) BFS(G,i);}/************************************************************************//* 主函数调用 *//************************************************************************/int main(){ALGraph G;CreateGraphAL(&G);printf("深度优先遍历:/n");DFSTraverseM(&G);printf("广度优先遍历:/n");BFSTraverseM(&G);return 0;}
自己写的邻接表建立,不是很规范。。
#include <stdio.h>#include <stdlib.h>#define number 20typedef struct node{int data;struct node *next;}node;typedef struct graph{node map[number+1];int vertex,edge;}graph;void CreatGraph(graph *G){int i;int x,y,temp;node *tmp;//输入顶点、边个数scanf("%d%d",&G->vertex,&G->edge);//输入顶点信息for(i=1;i<=G->vertex;i++){scanf("%d",&G->map[i].data);G->map[i].next = NULL;}//输入弧的信息for(i=1;i<=G->edge;i++){scanf("%d%d%d",&x,&y,&temp);tmp = (node*)malloc(sizeof(node));tmp->data = temp;tmp->next = G->map[x].next;G->map[x].next = tmp;tmp = (node*)malloc(sizeof(node));tmp->data = temp;tmp->next = G->map[y].next;G->map[y].next = tmp;}}void DisplayGraph(graph *G){int i;node* s;for(i=1;i<=G->vertex;i++){s = G->map[i].next;while(s){printf("%d ",s->data);s = s->next;}printf("\n");}}int main(){graph G;CreatGraph(&G);DisplayGraph(&G);return 0;}
参照<<算法导论>>重新写了一下广搜
#include <iostream>#include <cstdlib>#include <queue>#include <algorithm>#define MAX 0x7fffffff#define number 20using namespace std;typedef struct node{int data;struct node *next;}node;typedef struct graph{node map[number+1];int vertex,edge;}graph;int d[number+1],father[number+1],color[number+1];const int white=0,gray=1,black=2;void CreatGraph(graph *G){int i;int x,y;node *tmp;//输入顶点、边个数cin>>G->vertex>>G->edge;//输入顶点信息for(i=1;i<=G->vertex;i++){G->map[i].data = i;G->map[i].next = NULL;d[i]=MAX;color[i]=white;}//输入弧的信息for(i=1;i<=G->edge;i++){cin>>x>>y;tmp = (node*)malloc(sizeof(node));tmp->data = y;tmp->next = G->map[x].next;G->map[x].next = tmp;}}void bfs(graph *G){node *s;queue<int>bfs_queue;int u;color[1]=gray;d[1]=0;father[1]=0;bfs_queue.push(1);while(!bfs_queue.empty()){u = bfs_queue.front();s = G->map[u].next;while(s){if(color[s->data]==white){color[s->data]=gray;d[s->data]=u+1;father[s->data]=u;cout<<s->data<<" ";}bfs_queue.push(s->data);s=s->next;}color[u]=black;bfs_queue.pop();}cout<<endl;}int main(){graph G;CreatGraph(&G);bfs(&G);return 0;}
- 图--邻接表(建立、深搜、广搜)
- 邻接表非递归广搜(有向图)
- 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
- 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
- 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
- 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
- 邻接表建立图
- 数据结构(17)——基于邻接表的基本操作:构造,深搜(DFS),广搜(BFS)
- 邻接表的深搜与广搜遍历
- poj 3635 (最短路,广搜,邻接表,dp)
- 无向图建立 邻接表(2)
- 邻接表存储图的建立
- 图的邻接表的建立 c++
- 图的邻接表建立思想
- 无向图 邻接表 建立
- 图的建立之邻接表的建立及遍历
- 邻接链表的建立
- vector 邻接表的建立
- 横表与纵表的区分
- bzoj1858
- proteus元件表
- 黑马程序员_基础回顾之多线程
- 如何走好后面的路?
- 图--邻接表(建立、深搜、广搜)
- 夏季哪些蔬菜不适合生吃凉拌,食用会发生危险
- 一个暴风雨的夜晚——一个普通而又伟大老师的一天
- Wordpress主题制作不完全指南
- 关系型数据库性能优化总结
- java OO基本概念
- C#中判断两个类型是否能够匹配
- java JTable排序和过滤(JDK 6.0新功能)
- C#页面中播放flash视频的调用总结(不断更新中....)