图的建立和BFS、DFS
来源:互联网 发布:网络诈骗200元立案吗 编辑:程序博客网 时间:2024/06/16 13:05
#include<iostream>#include<fstream>#include<vector>#include<algorithm>#include<string>#include<map>#include<queue>#include<functional>using namespace std;ifstream inFile("C:\\Users\\DELL\\Desktop\\in.txt", ios::in);const int MaxVertexNum = 100;typedef int Vertex;typedef int WeightType;typedef char DatatType;//边的定义typedef struct ENode *PtrToENode;struct ENode{Vertex V1, V2;WeightType Weight;};typedef PtrToENode Edge;//邻接点的定义typedef struct AdjVNode *PtrToAdjVNode;struct AdjVNode{WeightType Weight;Vertex AdjV;PtrToAdjVNode Next;};//顶点表头结点的定义typedef struct VNode{PtrToAdjVNode FirstEdge;DatatType Data;}AdjList[MaxVertexNum];typedef struct GNode* PtrToGNode;struct GNode{int Nv;int Ne;AdjList G;};typedef PtrToGNode LGraph;LGraph CreateGraph(int VertexNum){LGraph Graph;Graph = new GNode;Graph->Ne = 0;Graph->Nv = VertexNum;for(int i=0;i<Graph->Nv;++i){Graph->G[i].FirstEdge = nullptr;}return Graph;}void InsertEdge(LGraph Graph, ENode Edge){PtrToAdjVNode NewNode = new AdjVNode;NewNode->AdjV = Edge.V2;NewNode->Weight = Edge.Weight;NewNode->Next = Graph->G [Edge.V1 ].FirstEdge ;Graph->G[Edge.V1].FirstEdge = NewNode;PtrToAdjVNode NewNode1 = new AdjVNode;NewNode1->AdjV = Edge.V1;NewNode1->Weight = Edge.Weight;NewNode1->Next = Graph->G[Edge.V2].FirstEdge;Graph->G[Edge.V2].FirstEdge = NewNode1;}LGraph Build(){LGraph Graph;Vertex V;ENode E;inFile >> V;Graph = CreateGraph(V);for(int i=0;i<V;++i){inFile >> Graph->G[i].Data;}inFile >> Graph->Ne ;if(Graph->Ne ){for(int i=0;i<Graph->Ne ;++i){inFile >> E.V1 >> E.V2 >> E.Weight;InsertEdge(Graph, E);}}return Graph;}void Print(LGraph Graph){if(Graph->Nv !=0){for(int i=0;i<Graph->Nv ;++i){PtrToAdjVNode It = Graph->G[i].FirstEdge;cout << Graph->G[i].Data << " ";while(It){cout << Graph->G [It->AdjV].Data << "";It = It->Next;}cout << endl;}}}void Visit(Vertex V){printf("正在访问顶点%d\n", V);}/* Visited[]为全局变量,已经初始化为false */void DFS(LGraph Graph, bool* Visited, Vertex V){ /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */PtrToAdjVNode W;Visit(V); /* 访问第V个顶点 */Visited[V] = true; /* 标记V已访问 */for (W = Graph->G[V].FirstEdge; W; W = W->Next) /* 对V的每个邻接点W->AdjV */if (!Visited[W->AdjV]) /* 若W->AdjV未被访问 */DFS(Graph, Visited, W->AdjV); /* 则递归访问之 */}void BFS(LGraph Graph,bool* Visited,int index){queue<PtrToAdjVNode> Q;Visited[index] = true;Visit(index);PtrToAdjVNode P = new AdjVNode;P->AdjV = index;P->Next = nullptr;Q.push(P);while(Q.size()){int a = Q.front()->AdjV;PtrToAdjVNode it = Graph->G [Q.front()->AdjV ].FirstEdge ;Q.pop();while(it){if(Visited[it->AdjV ]==false){Q.push(it);Visited[it->AdjV] = true;Visit(it->AdjV);}it = it->Next;}}}void PrintBFS(LGraph Graph, bool* Visited){cout << "广度优先搜索" << endl;for (int i = 0; i<Graph->Nv; ++i) {if (Visited[i] == false) {BFS(Graph, Visited, i);}}}void PrintDFS(LGraph Graph, bool* Visited){cout << "深度优先搜索" << endl;for (int i = 0; i<Graph->Nv; ++i) {if (Visited[i] == false) {DFS(Graph, Visited, i);}}}int main(){LGraph Graph = Build();Print(Graph);bool Visited[MaxVertexNum], Visited1[MaxVertexNum];for(int i=0;i<Graph->Nv ;++i){Visited[i] = false;Visited1[i]= false;}PrintBFS(Graph, Visited);cout << endl << endl;cout << endl << endl;PrintDFS(Graph, Visited1);delete Graph;inFile.close();system("pause");return 0;}
阅读全文
0 0
- 图的建立和BFS、DFS
- 图的建立 BFS DFS
- 图的邻接表建立以及DFS和BFS
- 图的建立-深度DFS-广度BFS
- 图的建立 与 DFS、BFS
- 图的建立及BFS,DFS遍历
- 图的dfs和bfs
- 邻接表图的建立与BFS、DFS
- 树和图的BFS 和 DFS
- 【图】BFS和DFS
- 图的BFS和DFS学习笔记
- 《大话数据结构》图的BFS和DFS
- 图的遍历(bfs 和dfs)
- 4.2-图的BFS和DFS
- 图的遍历:DFS和BFS
- 图的遍历:BFS和DFS
- 图的dfs遍历和bfs遍历
- 图的遍历:BFS和DFS
- 【libevent】源码学习(2)--配置event_base
- 聊聊wait和waitpid
- C# 调用存储过程Return返回值
- Exception in thread "main" java.lang.SecurityException问题解决方法
- linux 安装jdk
- 图的建立和BFS、DFS
- ssm从零搭建个人博客(一)
- MQ消息队列系列(1)为什么使用MQ
- win10自带的wifi热点打不开——解决办法
- 【C++】智能指针auto_ptr/unique_ptr/shared_ptr/weak_ptr!!!
- java多线程
- 欢迎使用CSDN-markdown编辑器
- centerloss论文学习笔记
- 路由算法