您的位置:首页 > 其它

图的邻接矩阵表示

2014-12-19 22:23 190 查看
图的表示有两种,一种是邻接矩阵,还有一种是邻接表,下面先讨论邻接矩阵,包括顶点和边的插入和删除,深度优先遍历和广度优先遍历。

其实可以不用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);
};
#endif
GraphMatrix.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: