图的遍历-BFS
来源:互联网 发布:java有参构造方法示例 编辑:程序博客网 时间:2024/05/21 23:16
1 数据文件如下
0 5
2 4
2 3
1 2
0 1
3 4
3 5
0 2
2 C++实现DFS算法
Graph.h
/* * Graph.h * * Created on: 2014年5月17日 * Author: zhongchao */#ifndef _GRAPH_#define _GRAPH_#include <fstream>#include <iostream>#include <ext/hash_map>#include <hash_set>#include <map>#include<limits>#include <stdio.h>#include <string.h>#include <vector>#include<stdlib.h>#include<stdio.h>using namespace std;using namespace __gnu_cxx;class Graph{private:hash_map<int, vector<int> > adj;hash_set<int> nodes;int _v; //节点的个数int _e; //边的条数public:Graph(string path);void addEdge(int a, int b);vector<int> getEdges(int n);hash_set<int> getNodes();int v(); //节点的个数int e(); //边的个数};//----------------------------------------------------------------------#endif /* _GRAPH_*/
Graph.cpp
/* * Graph.cpp * * Created on: 2014年5月17日 * Author: zhongchao */#include "Graph.h"Graph::Graph(string path): _v(0), _e(0){ifstream reader(path.c_str(), ios::in);if(reader.is_open()){while(reader.eof() != EOF){int a, b;reader>>a>>b;_e++;if(reader.fail())break;addEdge(a, b);nodes.insert(a);nodes.insert(b);}}}void Graph::addEdge(int a, int b){hash_map<int, vector<int> >::iterator it = adj.find(a);if(it == adj.end()){vector<int> tmp;tmp.push_back(b);adj.insert(pair<int, vector<int> >(a, tmp));}else{it->second.push_back(b);}it = adj.find(b);if(it == adj.end()){vector<int> tmp;tmp.push_back(a);adj.insert(pair<int, vector<int> >(b, tmp));}else{it->second.push_back(a);}}int Graph::v(){return nodes.size();}vector<int> Graph::getEdges(int n){return adj.find(n)->second;}hash_set<int> Graph::getNodes(){return nodes;}
BFS.h
/* * BFS.h * * Created on: 2014年6月2日 * Author: zhongchao */#ifndef _BFS_#define _BFS_#include "Graph.h"void bfsTtest();class BFS{private:bool* mark;int* edgeTo;int startNode;Graph* _graph;vector<int> pq;public:BFS(Graph* graph, int n);~BFS();void bfs(Graph* graph, int n);bool hasPathTo(int n);vector<int> pathTo(int n);void printPaths();};#endif /* _BFS_ */
BFS.cpp
/* * BFS.cpp * * Created on: 2014年6月2日 * Author: zhongchao *//* * DFS.cpp * * Created on: 2014年6月1日 * Author: zhongchao */#include "BFS.h"BFS::BFS(Graph* graph, int n): _graph(graph),startNode(n){mark = new bool[graph->v()];edgeTo = new int[graph->v()];bfs(graph, n);}void BFS::bfs(Graph* graph, int n){mark[n] = true;pq.push_back(n);while(pq.size() > 0){int preN = *(pq.begin());pq.erase(pq.begin());vector<int> ns = graph->getEdges(preN);for(vector<int>::iterator it = ns.begin(); it != ns.end(); it++){if(mark[*it] == true) continue;edgeTo[*it] = preN;pq.push_back(*it);mark[*it] = true;}}}bool BFS::hasPathTo(int n){return mark[n];}vector<int> BFS::pathTo(int n){vector<int> tmp;if(hasPathTo(n) == true){tmp.push_back(n);int s = edgeTo[n];tmp.push_back(s);while(s != startNode){s= edgeTo[s];tmp.push_back(s);}//tmp.push_back(startNode);return tmp;}elsereturn tmp;}void BFS::printPaths(){for(int i = 0; i < _graph->v(); i++){cout<<i<<" "<<edgeTo[i]<<endl;}hash_set<int> nodes = _graph->getNodes();for(hash_set<int>::iterator it = nodes.begin(); it != nodes.end(); it++){int n = *it;if(n == startNode) continue;if(hasPathTo(n) == true){char str[250];vector<int> edges = pathTo(n);string p = "";for(vector<int>::reverse_iterator it1 = edges.rbegin(); it1 != edges.rend(); it1++){sprintf(str, "%d", *it1);p += string(str)+"->";//cout<<*it1<<"->";}cout<<p<<"end"<<endl;}}}BFS::~BFS(){delete[] mark;delete[] edgeTo;}void bfsTest(){string path("/home/zhongchao/worksapce/cpp/ComputeAlgorithms/data/tinyCG.txt");Graph* graph = new Graph(path);int n = 0;BFS* bfs = new BFS(graph, n);bfs->printPaths();}
测试文件
#include "DFS.h"void bfsTest();int main(int argc, char** argv){bfsTest();return 1;}遍历的路径如下
0->1->end
0->2->end
0->5->3->end
0->5->3->4->end
0->5->end
0 0
- 图的遍历BFS
- BFS图的遍历
- 图的遍历-BFS
- 图的遍历BFS
- 图的dfs遍历和bfs遍历
- 图的遍历:DFS BFS
- 图的广度遍历(BFS)
- 图的遍历(DFS&BFS)
- 图的遍历[DFS][BFS]
- 广度优先遍历BFS的图算法
- 图的建立及BFS,DFS遍历
- 图的遍历(BFS, DFS)源代码
- 图的遍历(bfs 和dfs)
- 图的遍历---广度优先搜索(BFS)
- 图的遍历:DFS和BFS
- 图的遍历(BFS,DFS)
- 图的遍历:BFS和DFS
- 图的遍历:BFS和DFS
- quick-cocos2d-x教程7:程序框架内framework目录分析
- Makefile的基础知识
- android contentprovider (4)
- 基于XMPP协议的手机多方多端即时通讯方案
- 企业贡献开源,其背后的战略动机是什么?
- 图的遍历-BFS
- win7下安装IIS7.0及部署VS2010 ASP.NET程序网站的相关问题
- 莫名在苦恼
- 杨澜访谈录:花开花落的王学圻
- android初步实现Activity之间的跳转和数据传递
- hdu-1850 Being a Good Boy in Spring Festival
- nginx Windows版使用说明
- python再学习1
- 数据挖掘笔记-关联规则-FPGrowth-简单实现