博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
B00015 C++实现的图类
阅读量:6902 次
发布时间:2019-06-27

本文共 5448 字,大约阅读时间需要 18 分钟。

代码来自:。

graph.h文件内容如下:

#include
#include
#include
#include
#include
#include
#include
#include
#define MAXSIZE 100using namespace std;class Vertex{ private: pair
> V; public: Vertex(){}; Vertex(int); bool addAdjVertex(int); friend bool operator==(Vertex const &, Vertex const &); friend bool operator<(Vertex const &, Vertex const &); friend bool operator>(Vertex const &, Vertex const &);};class Edge{ private: int weight; int src; int dst; public: Edge(){}; Edge(int, int, int); ~Edge(){}; friend bool operator==(Edge const &, Edge const &); //friend bool operator<(Edge const &, Edge const &); //friend bool operator>(Edge const &, Edge const &); int getWeight(); int getSource(); int getDest();};class Graph{ private: map
> vertices; list
edges; set
visited; public: Graph(); bool addVertex(int); bool addEdge(int, int, int); bool deleteVertex(int); void print(); void bfs(); void dfstraversal(); void dfs(int, list
); void pathSum(int); void findpath(int, int, char *, int, int); void bellman(); list
topologicalSort(); void topo();};
graph.cpp文件内容如下:

#include
Vertex::Vertex(int v){}bool Vertex::addAdjVertex(int v) {}list
order;bool operator==(Vertex const &v1, Vertex const &v2){ return true;}bool operator<(Vertex const &v1, Vertex const &v2){ return true;}bool operator>(Vertex const &v1, Vertex const &v2){ return true;}Edge::Edge(int a, int s1, int s2){ weight = a; src = s1; dst = s2;}int Edge::getWeight(){return weight;}int Edge::getSource(){return src;}int Edge::getDest(){return dst;}bool operator==( Edge const &e1, Edge const & e2){ if(e1.weight==e2.weight && e1.src==e2.src && e1.dst == e2.dst) return true; return false;}Graph::Graph(){}bool Graph::addVertex(int v){ list
adjList; vertices.insert(pair
>(v, adjList)); }bool Graph::addEdge(int wt, int s, int d){ edges.push_back(Edge(wt, s, d)); map
>::iterator sit = vertices.find(s); if(sit!=vertices.end()) sit->second.push_back(d); else { list
adjList; adjList.push_back(d); vertices.insert(pair
>(s, adjList)); } sit = vertices.find(d); if(sit == vertices.end()) { list
adjList1; vertices.insert(pair
>(d, adjList1)); }}bool Graph::deleteVertex(int v){}void Graph::print(){ map
>::iterator it; for(it = vertices.begin();it!=vertices.end();it++) { cout<<"Node "<
first<<'-'; for(list
::iterator lit = it->second.begin();lit!=it->second.end();lit++) cout<<*lit<<','; cout<
q; visited.clear(); q.push(vertices.begin()->first); visited.insert(vertices.begin()->first); cout<<"\n BFS Traversal :"; while(q.size() > 0) { int v = q.front(); q.pop(); list
adjList = vertices.find(v)->second; list
::iterator it; set
::iterator sit; for(it = adjList.begin();it!=adjList.end();it++) { sit = visited.find(*it); if(sit!=visited.end()) continue; visited.insert(*it); q.push(*it); } cout<
<<" "; }}void Graph::dfstraversal(){ visited.clear(); cout<<"\nDFS Traversal :"; map
>::iterator it; for(it = vertices.begin();it!=vertices.end();it++) { if(visited.find(it->first) != visited.end()) continue; visited.insert(it->first); dfs(it->first, it->second); } cout<
adj){ list
::iterator lit; for(lit = adj.begin();lit!=adj.end();lit++) { if(visited.find(*lit) != visited.end()) continue; visited.insert(*lit); dfs(*lit, vertices.find(*lit)->second); } cout<
<<' '; order.push_front(v);}void Graph::pathSum(int sum){ char *str; str = (char *)malloc(100); memset(str, 0, 100); visited.clear(); map
>::iterator it; it = vertices.begin(); findpath(sum, 0, str, 0, it->first);}void Graph::findpath(int sum, int cval, char *str, int in, int curr){ if(curr+cval > sum) return; if(cval+curr == sum) { str[in] = '0' + curr; str[in+1] = '\0'; cout<
<
>::iterator it; it = vertices.find(curr); if(it==vertices.end()) return; list
adj = it->second; for(list
::iterator lit = adj.begin();lit!=adj.end();lit++) findpath(sum, cval, str, in+1, *lit); for(list
::iterator lit = adj.begin();lit!=adj.end();lit++) { if(visited.find(*lit)==visited.end()) { visited.insert(*lit); findpath(sum, 0, str, 0, *lit); } } }}void Graph::bellman(){ order.clear(); dfstraversal(); map
vd; map
>::iterator it; int vlen = vertices.size(); for(it = vertices.begin();it!=vertices.end();it++) vd.insert(pair
(it->first, INT_MAX)); vd.find(vertices.begin()->first)->second = 0; list
::iterator lit; for(lit=order.begin();lit!=order.end();lit++) { list
::iterator it; for(it = edges.begin();it!=edges.end();it++) { int src = it->getSource(); int dst = it->getDest(); int wt = it->getWeight(); if(src!=*lit) continue; if(vd.find(dst)->second > vd.find(src)->second+wt) vd.find(dst)->second = vd.find(src)->second+wt; } } map
::iterator mit; for(mit = vd.begin();mit!=vd.end();mit++) cout<
first<<" at dist "<
second<
Graph::topologicalSort(){ order.clear(); dfstraversal(); for(list
::iterator it = order.begin();it!=order.end();it++) cout<<*it; return order;}void Graph::topo(){ order.push_back(4);}int main(){ Graph g; g.addEdge(1,1,2); g.addEdge(1,1,3); g.addEdge(1,2,4); g.addEdge(1,2,5); g.addEdge(1,3,6); g.addEdge(1,3,8); g.print(); g.bfs(); g.dfstraversal(); g.pathSum(8); cout<

转载于:https://www.cnblogs.com/tigerisland/p/7564714.html

你可能感兴趣的文章
软件测试工具MonkeyTalk使用方法
查看>>
使用python进行文件备份
查看>>
《数据结构与抽象:Java语言描述(原书第4版)》一JI2.2.1 延缓处理:throws子句...
查看>>
看,那人好像一个产品狗,对,这就是产品狗
查看>>
《 Java并发编程从入门到精通》 Java线程池的监控
查看>>
《Ansible权威指南》一1.8 Python多环境扩展管理
查看>>
《全栈性能测试修炼宝典 JMeter实战》—第1章 1.5节从招聘要求看岗位价值
查看>>
Gartner2017年十大技术趋势
查看>>
sum() 函数性能堪忧,列表降维有何良方?
查看>>
fastreport 导出图片并打印
查看>>
学习html我们从百度百科开始
查看>>
如何Spring Cloud Zuul作为网关的分布式系统中整合Swagger文档在同一个页面上
查看>>
实现一个炫酷的随机标签排列效果(颜色随机,大小随机,成菱形排列的列表)...
查看>>
flex 布局
查看>>
数字资产交易所开发:平台币快速吸金的背后
查看>>
小程序自定义音频组件,带滚动条,IOS循环失效问题
查看>>
Swift开发之粒子动画的实现
查看>>
我学Java我傲娇
查看>>
挖矿蠕虫肆虐,详解云防火墙如何轻松“制敌”
查看>>
Linux -- Samba之客户端访问(Linux和windows)
查看>>