图的邻接矩阵表示
2014-12-19 22:23
190 查看
图的表示有两种,一种是邻接矩阵,还有一种是邻接表,下面先讨论邻接矩阵,包括顶点和边的插入和删除,深度优先遍历和广度优先遍历。
其实可以不用Vertex和Edge两个结构体,而直接用vector<char> V和vector<vector<int> >E,来表示边,最多为了遍历,加上一个vector<bool> visited的向量。就可以完全完成存储,插入,删除和遍历的基本操作了!
GraphMatrix.h的内容如下:
其实可以不用Vertex和Edge两个结构体,而直接用vector<char> V和vector<vector<int> >E,来表示边,最多为了遍历,加上一个vector<bool> visited的向量。就可以完全完成存储,插入,删除和遍历的基本操作了!
GraphMatrix.h的内容如下:
//GraphMatrix.h #ifndef __GraphMatrix__ #define __GraphMatrix__ #include<iostream> #include<vector> using namespace std; struct Vertex { char data; bool visited; Vertex(char d=0) { data=d; visited=false; } }; struct Edge { int weight; Edge(int w=INT_MAX) { weight=w; } }; class GraphMatrix { int n; int e; vector<Vertex> V;//顶点集合 vector<vector<Edge> >E;//边的集合 void DFS(Vertex& v); void BFS(Vertex x); public: GraphMatrix() { n=e=0; } int insertVertex(Vertex & v); void insertEdge(Vertex &from,Vertex &to,Edge &e); void removeEdge(Vertex &from,Vertex &to); void removeVertex(Vertex &v); void dfs(Vertex v); void bfs(Vertex v); }; #endifGraphMatrix.cpp内容:
//GraphMatrix.cpp #include"GraphMatrix.h" #include<queue> using namespace std; void GraphMatrix::DFS(Vertex& v) { if(v.visited==true) return ; int k=-1; for(int i=0;i<V.size();i++) if(V[i].data==v.data) { k=i; break; } if(k==-1) return ; if(V[k].visited==false) { V[k].visited=true; cout<<v.data<<endl; } for(int i=0;i<E[k].size();i++) { if(E[k][i].weight!=INT_MAX && V[i].visited==false) DFS(V[i]); } } void GraphMatrix::BFS(Vertex x) { queue<Vertex> q; q.push(x); while(!q.empty()) { Vertex v=q.front(); int k=-1; for(int i=0;i<V.size();i++) if(V[i].data==v.data) { k=i; break; } if(k==-1) return ; if(V[k].visited==false) { V[k].visited=true; cout<<v.data<<endl; } for(int i=0;i<E[k].size();i++) { if(E[k][i].weight!=INT_MAX && V[i].visited==false) q.push(V[i]); } q.pop(); } } int GraphMatrix::insertVertex(Vertex & v) { V.push_back(v); E.push_back(vector<Edge>(V.size())); if(E.size()>1) for(int i=0;i<V.size()-1;i++) E[i].push_back(Edge()); return V.size()-1; } void GraphMatrix::insertEdge(Vertex &from,Vertex &to,Edge &e) { int k=0; int p=-1,q=-1; for(int i=0;i<V.size();i++) { if(V[i].data==from.data) { k+=1; p=i; } if(V[i].data==to.data) { k+=2; q=i; } } if((k&1)==0) p=insertVertex(from); if((k&2)==0) q=insertVertex(to); E[p][q]=e; E[q][p]=e; } void GraphMatrix::removeEdge(Vertex &from,Vertex &to) { int k=0; int p=-1,q=-1; for(int i=0;i<V.size();i++) { if(V[i].data==from.data) p=i; if(V[i].data==to.data) q=i; } if(p==-1 || q==-1) return ; else E[p][q]=E[q][p]=INT_MAX; } void GraphMatrix::removeVertex(Vertex &v) { int k=-1; for(int i=0;i<V.size();i++) { if(V[i].data==v.data) k=i; } if(k==-1) return ; V.erase(V.begin()+k); for(int i=0;i<E.size();i++) E[i].erase(E[i].begin()+k); E.erase(E.begin()+k); } void GraphMatrix::dfs(Vertex v) { for(int i=0;i<V.size();i++) V[i].visited=false; DFS(v); for(int i=0;i<V.size();i++) if(V[i].visited==false) DFS(V[i]); } void GraphMatrix::bfs(Vertex v) { for(int i=0;i<V.size();i++) V[i].visited=false; BFS(v); for(int i=0;i<V.size();i++) if(V[i].visited==false) BFS(V[i]); }测试的main函数如下:
#include<iostream> #include<vector> #include<queue> #include"GraphMatrix.h" using namespace std; #define DEBUG int main() { #ifdef DEBUG freopen("input.txt","r",stdin); #endif GraphMatrix gm; char vertex,from,to; int e; //测试边和顶点的插入 cout<<"输入边"<<endl; while(cin>>from>>to>>e) { cout<<"输入边"<<endl; gm.insertEdge(Vertex(from),Vertex(to),Edge(e)); } //测试深度优先搜索 gm.dfs(Vertex('A')); //测试广度优先搜索 gm.bfs(Vertex('B')); //测试边和顶点的删除 gm.removeEdge(Vertex('A'),Vertex('B')); gm.removeVertex(Vertex('C')); system("pause"); return 0; }
相关文章推荐
- 数据结构——求邻接矩阵表示的图的关节点
- 7-1-图、表的数组(邻接矩阵)表示法-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
- 拓扑排序-邻接矩阵表示
- 使用邻接矩阵表示图
- 图的邻接矩阵表示法
- 数据结构C语言--邻接矩阵表示有向网
- 图(2)—— 邻接矩阵表示法
- 图的深度优先遍历(用邻接矩阵表示图)
- 图深度优先遍历邻接矩阵表示
- 邻接矩阵和邻接表表示
- 数据结构(C实现)------- 图的邻接矩阵表示
- 图的表示-邻接矩阵表示
- 图的邻接矩阵和邻接表表示,及相互之间的转换
- 图--邻接矩阵(数组表示法)
- 图的数组表示(邻接矩阵)
- 数据结构与算法分析(Java语言描述)(26)—— 邻接矩阵表示稠密图
- Dijkstra算法-最短路径-邻接矩阵表示
- 表示图的静态邻接矩阵
- 邻接矩阵表示有向带权图
- java 图的邻接矩阵表示,深度优先遍历,广度优先遍历