您的位置:首页 > 编程语言 > C语言/C++

邻接矩阵深度与广度优先遍历算法(c++实现)

2009-09-17 20:57 337 查看
邻接矩阵深度与广度优先遍历算法(c++实现)

//头文件 AdjMWGraph.h
#ifndef AdjMWGraph_H
#define AdjMWGraph_H
class AdjMWGraph
{
private:
SeqList Vertices;
int Edge[MaxVertices][MaxVertices];
int numOfEdges;
public:
AdjMWGraph(const int sz=MaxVertices);
int GraphEmpty() const
{
return Vertices.ListEmpty();
}
int NumOfVertices()
{
return Vertices.ListSize();
}
int NumOfEdges()
{
return numOfEdges;
}
VerT GetValue(const int i);
int GetWeight(const int v1,const int v2);
void InsertVertex(const VerT & vertex);
void InsertEdge(const int v1,const int v2,int weight);
void DeleteVertex(const int i);
void DeleteEdge(const int v1,const int v2);
int GetFirstNeighbor(const int v);
int GetNextNeighbor(const int v1,const int v2);
void DepthFirstSearch(const int v,int visited[],void visit(VerT item));
void BroadFirstSearch(const int v,int visited[],void visit(VerT item));
void DepthFirstSearch(void visit(VerT item));
void BroadFirstSearch(void visit(VerT item));
};
AdjMWGraph::AdjMWGraph(const int sz)
{
for(int i=0;i<sz;i++)
for(int j=0;j<sz;j++)
{
if(i==j)
Edge[j]=0;
else
Edge[j]=MaxWeight;
}
numOfEdges=0;
}
VerT AdjMWGraph::GetValue(const int i)
{
if(i<0 || i>Vertices.ListSize())
{
cout<<"参数I越界出错!"<<endl;
exit(0);
}
return Vertices.GetData(i);
}
int AdjMWGraph::GetWeight(const int v1,const int v2)
{
if(v1<0 || v1>Vertices.ListSize() || v2<0 || v2>Vertices.ListSize())
{
cout<<"参数V1和V2越界出错!"<<endl;
exit(0);
}
return Edge[v1][v2];
}
void AdjMWGraph::InsertVertex(const VerT & vertex)
{
Vertices.Insert(vertex,Vertices.ListSize());
}
void AdjMWGraph::InsertEdge(const int v1,const int v2,int weight)
{
if(v1<0 || v1>Vertices.ListSize() || v2<0 || v2>Vertices.ListSize())
{
cout<<"参数V1或V2越界出错!"<<endl;
exit(0);
}
Edge[v1][v2]=weight;
numOfEdges++;
}
void AdjMWGraph::DeleteVertex(const int v)
{
int i,j;
for(i=0;i<Vertices.ListSize();i++)
for(j=0;j<Vertices.ListSize();j++)
if((i==v || j==v) && Edge[j]>0 && Edge[j]<MaxWeight)
numOfEdges--;
for(i=v;i<Vertices.ListSize();i++)
for(j=v;j<Vertices.ListSize();j++)
Edge[j]=Edge[i+1][j];
for(i=0;i<Vertices.ListSize();i++)
for(j=v;j<Vertices.ListSize();j++)
Edge[j]=Edge[j+1];
Vertices.Delete(v);
}
void AdjMWGraph::DeleteEdge(const int v1,const int v2)
{
if(v1<0 || v1>Vertices.ListSize() || v2<0 || v2>Vertices.ListSize())
{
cout<<"参数V1或V2越界出错!"<<endl;
exit(0);
}
Edge[v1][v2]=MaxWeight;
numOfEdges--;
}

int AdjMWGraph::GetFirstNeighbor(const int v)
{
if(v<0 || v>Vertices.ListSize())
{
cout<<"参数V1越界出错!"<<endl;
exit(0);
}
for(int col=0;col<=Vertices.ListSize();col++)
if(Edge[v][col]>0 && Edge[v][col]<MaxWeight)
return col;
return -1;
}
int AdjMWGraph::GetNextNeighbor(const int v1,const int v2)
{
if(v1<0 || v1>Vertices.ListSize() || v2<0 || v2>Vertices.ListSize())
{
cout<<"参数V1或V2越界出错!"<<endl;
exit(0);
}
for(int col=v2+1;col<=Vertices.ListSize();col++)
if(Edge[v1][col]>0 && Edge[v1][col]<MaxWeight)
return col;
return -1;
}
void AdjMWGraph::DepthFirstSearch(const int v,int visited[],void visit(VerT item))
{
visit(GetValue(v));
visited[v]=1;
int w=GetFirstNeighbor(v);
while(w!=-1)
{
if(! visited[w])
DepthFirstSearch(w,visited,visit);
w=GetNextNeighbor(v,w);
}
}
void AdjMWGraph::BroadFirstSearch(const int v,int visited[],void visit(VerT item))
{
VerT u,w;
SeqQueue queue;
visit(GetValue(v));
visited[v]=1;
queue.QInsert(v);
while(! queue.QueueEmpty())
{
u=queue.QDelete();
w=GetFirstNeighbor(u);
while(w!=-1)
{
if(!visited[w])
{
visit(GetValue(w));
visited[w]=1;
queue.QInsert(w);
}
w=GetNextNeighbor(u,w);
}
}
}
void AdjMWGraph::DepthFirstSearch(void visit(VerT item))
{
int *visited=new int[NumOfVertices()];
for(int i=0;i<NumOfVertices();i++)
visited=0;
for(i=0;i<NumOfVertices();i++)
if(! visited)
DepthFirstSearch(i,visited,visit);
delete [] visited;
}
void AdjMWGraph::BroadFirstSearch(void visit(VerT item))
{
int * visited=new int[NumOfVertices()];
for(int i=0;i<NumOfVertices();i++)
visited=0;
for(i=0;i<NumOfVertices();i++)
if(! visited)
BroadFirstSearch(i,visited,visit);
delete [] visited;
}

#endif

//头文件 AdjMWGraphLib.h
#ifndef AdjMWGraphLib_H
#define AdjMWGraphLib_H
struct RowColWeight
{
int row;
int col;
int weight;
};
void CreatGraph(AdjMWGraph & G,DataType V[],int n,RowColWeight E[],int e)
{
for(int i=0;i<n;i++)
G.InsertVertex(V);
for(int k=0;k<e;k++)
G.InsertEdge(E[k].row,E[k].col,E[k].weight);
}
void Printchar(char item)
{
cout<<item<<" ";
}
#endif

//头文件 SeqList.h
#ifndef SeqList_H
#define SeqList_H
class SeqList
{
private:
DataType data[MaxListSize];
int size;
public:
SeqList();
~SeqList();
int ListSize() const;
int ListEmpty() const;
int Find(DataType & item) const;
DataType GetData(int pos) const;
void Insert(const DataType & item,int pos);
DataType Delete(const int pos);
void ClearList();
};
SeqList::SeqList()
{
size=0;
}
SeqList::~SeqList()
{
}
int SeqList::ListSize() const
{
return size;
}
int SeqList::ListEmpty() const
{
if(size==0)
return 1;
else
return 0;
}
int SeqList::Find(DataType & item) const
{
if(size==0)
return -1;
int i=0;
while(i<size && item != data)
i++;
if(i<size)
return i;
else
return -1;
}
DataType SeqList::GetData(int pos) const
{
if(pos<0 || pos>size-1)
{
cout<<"参数POS越界出错"<<endl;
exit(0);
}
return data[pos];
}
void SeqList::Insert(const DataType & item,int pos)
{
int i;
if(size==MaxListSize)
{
cout<<"顺序表已满无法插入!"<<endl;
exit(0);
}
if(pos<0 || pos>size)
{
cout<<"参数POS越界出错!"<<endl;
exit(0);
}
for(i=size;i>pos;i--)
data=data[i-1];
data[pos]=item;
size++;
}
DataType SeqList::Delete(const int pos)
{
if(size==0)
{
cout<<"顺序表已经空无元素可删!"<<endl;
exit(0);
}
if(pos<0 || pos>size-1)
{
cout<<"参数已经越界出错!"<<endl;
exit(0);
}
DataType temp=data[pos];
for(int i=pos;i<size-1;i++)
data=data[i+1];
size--;
return temp;
}
void SeqList::ClearList()
{
size=0;
}
#endif

//头文件 SeqQueue.h
#ifndef SeqQueue_H
#define SeqQueue_H
class SeqQueue
{
private:
DataType data[MaxQueueSize];
int front;
int rear;
int count;
public:
SeqQueue()
{
front=rear=0;count=0;
}
~SeqQueue()
{
}
void QInsert(const DataType & item);
DataType QDelete();
DataType QFront() const;
int QueueEmpty() const
{
return front==rear;
}
void ClearQueue()
{
front=rear=0;count=0;
}
int GetSize()const
{
return count;
}
};
void SeqQueue::QInsert(const DataType & item)
{
if(count==MaxQueueSize)
{
cout<<"队列已满!"<<endl;
exit(0);
}
data[rear]=item;
rear=(rear+1)%MaxQueueSize;
count++;
}
DataType SeqQueue::QDelete()
{
DataType temp;
if(count==0)
{
cout<<"队列已空!"<<endl;
exit(0);
}
temp=data[front];
front=(front+1)%MaxQueueSize;
count--;
return temp;
}
DataType SeqQueue::QFront() const
{
if(count==0)
{
cout<<"队列空!"<<endl;
exit(0);
}
return data[front];
}
#endif

// cpp文件
#include <iostream.h>
#include <stdlib.h>
typedef char DataType;
const MaxListSize=100;
const MaxQueueSize=100;
#include "SeqList.h"
#include "SeqQueue.h"
typedef char VerT;
const int MaxVertices=100;
const int MaxWeight=10000;
#include "AdjMWGraph.h"
#include "AdjMWGraphLib.h"
void main()
{
AdjMWGraph g;
char a[]={'A','B','C','D','E','F','G'};
RowColWeight rcw[]={{0,1,1},{0,2,1},{1,3,1},{1,4,1},{2,5,1},{2,6,1},{1,0,1},{2,0,1},{3,1,1},{4,1,1},{5,2,1},{6,2,1}};
int n=7,e=12;
CreatGraph(g,a,n,rcw,e);
cout<<"当前的顶点个数为:"<<g.NumOfVertices()<<endl;
cout<<"当前的边的条数为:"<<g.NumOfEdges()<<endl;

cout<<"深度优先搜索序列为:";
int *visited=new int[g.NumOfVertices()];
for(int i=0;i<g.NumOfVertices();i++)
visited=0;
g.DepthFirstSearch(0,visited,Printchar);
cout<<endl;

cout<<"广度优先搜索序列为:";
for(i=0;i<g.NumOfVertices();i++)
visited=0;
g.BroadFirstSearch(0,visited,Printchar);
delete [] visited;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐