图的广度遍历
来源:互联网 发布:淘宝联盟怎么自助推广 编辑:程序博客网 时间:2024/06/06 11:49
根据上一篇转载的文章写了写 出了很多问题;最主要的是队列问题, 队列的数据结构忘了。。
代码如下
#include <bits/stdc++.h>using namespace std;/*********** 队列的定义 ********/typedef struct QNode{ int data; struct QNode *next;}QNode;typedef struct Queue{ QNode *head, *tail; int len;}Queue;/*********** 队列的操作 ********/void InitQueue(Queue &Q){ Q.tail = Q.head = (QNode *)malloc(sizeof(QNode)); Q.tail->next = NULL; Q.len = 0;}void EnQueue(Queue &Q, int e){ QNode *p = (QNode *)malloc(sizeof(QNode));//带有头结点 p->data = e; Q.tail->next = p; Q.tail = p; Q.tail->next = NULL; Q.len++;}void DeQueue(Queue &Q, int &e){ QNode *temp = Q.head->next; e = temp->data; Q.head->next = temp->next; if(Q.tail == temp) Q.tail = Q.head; Q.len--; free(temp);}int visited[100];/*********** 图的定义 ********/typedef struct ArcNode{ int adjvex; // int weight; struct ArcNode *next;}ArcNode;typedef struct VNode{ int data; ArcNode *first;}VNode, AdjList[100];typedef struct{ AdjList vertices;//邻接表 int vexnum, arcnum;}ALGraph;/*********** 图的操作 ********/void AddArcNode(ALGraph &G, int arc1, int arc2){ ArcNode *p, *q, *add; add = (ArcNode *)malloc(sizeof(ArcNode)); add->adjvex = arc2; add->next = NULL; p = q = G.vertices[arc1].first; if(p == NULL) G.vertices[arc1].first = add; else { if(p->adjvex > add->adjvex) { add->next = p; G.vertices[arc1].first = add; } else { while(p->adjvex < add->adjvex && p->next != NULL) { q = p; p = p->next; } if(p->next == NULL) { if(p->adjvex < add->adjvex) p->next = add; else { q->next = add; add->next = p; } } else { add->next = p; q->next = add; } } }}void CreatALGraph(ALGraph &AG){ printf("please input vexnum, arcnum\n"); scanf("%d %d", &AG.vexnum, &AG.arcnum); for(int i = 0; i < AG.vexnum; ++i) { //scanf("%d", &AG.vertices[i].data); AG.vertices[i].data = i; AG.vertices[i].first = NULL; } for(int i = 0; i < AG.arcnum; ++i) { int a, b; scanf("%d %d", &a, &b); AddArcNode(AG, a, b); AddArcNode(AG, b, a);//无向图 }}void Visit(int e){ printf(" %d", e);}int FirstAdjVex(ALGraph AG, int v){ if(AG.vertices[v].first == NULL) return -1; else { return AG.vertices[v].first->adjvex; }}int NextAdjVex(ALGraph AG, int v, int w){ if(AG.vertices[v].first == NULL) return -1; else { ArcNode *p = AG.vertices[v].first; while(p->adjvex != w) { p = p->next; } if(p->next == NULL) return -1; else return p->next->adjvex; }}void BFS(ALGraph AG, int v, void (*Visit)(int)){ Visit(v); visited[v] = 1; Queue q; InitQueue(q); EnQueue(q, v); while(q.len >= 1) { DeQueue(q, v); for(int w = FirstAdjVex(AG, v); w >= 0; w = NextAdjVex(AG, v, w)) if(!visited[w]) { Visit(w); visited[w] = 1; EnQueue(q, w); } }}void BFSTraverse(ALGraph AG, int v, void (*Visit)(int)){ for(int i = 0; i < AG.vexnum; ++i) visited[i] = 0; BFS(AG, v, Visit); for(int i = 0; i < AG.vexnum; ++i) if(!visited[i]) BFS(AG, i, Visit);}void PrintfGraph(ALGraph AG){ for(int i = 0; i < AG.vexnum; ++i) { printf("%d 的临界点为 ", i); if(AG.vertices[i].first != NULL) { ArcNode *temp = AG.vertices[i].first; while(temp != NULL) { printf(" %d", temp->adjvex); temp = temp->next; } } else printf("NO"); printf("\n"); }}int main(){ ALGraph G; int V; CreatALGraph(G); PrintfGraph(G); scanf("%d", &V); BFSTraverse(G, V, Visit);}
阅读全文
0 0
- 图的广度遍历
- 图的广度遍历
- 图的广度遍历
- 图的深度 广度 遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度遍历(BFS)
- 图的广度优先遍历
- 图的广度、深度遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 密集图的广度遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 关于MyBatis和Spring整合时,No bean named 'xxx' is defined我遇到的问题
- 深度学习&计算机视觉界大牛主页
- Lua源码揭秘(三)一个比较简单的table库扩展
- JS 如何判断两个对象相等
- [NOIP模拟][图论]星星
- 图的广度遍历
- 新手村 循环 级数求和
- 关于原生js和JQuery的小记
- 3、node之pm2搭建node生产环境
- 阿里云oss迁移到腾讯云cos使用工具…
- Day04_Java_作业
- RecycleView 瀑布流中加载更多遇到的问题
- 阿里云oss数据迁移到腾讯云cos&nbs…
- linux配置bond双网卡绑定