源代码
#include<iostream>
#include<queue>
using namespace std;
class graph{
public:
graph(int point,int noEdge=0,bool flag=true){
this->point=point;
this->Nodege=noEdge;
this->flag=flag;
edge=0;
reach = NULL;
maxiz = new int *[point+1];
for(int i=1;i<=point;i++){
maxiz[i]=new int[point+1];
for(int j=1;j<=point;j++)maxiz[i][j]=noEdge;
}
}
~graph(){
delete[] maxiz;
if(reach)delete []reach;
}
bool check(int a) const{
return a<1||a>point;
}
void insertEdge(int a,int b,int weight=1){
if(check(a)||check(b)){
cout<<"输入的顶点不合法"<<endl;
return ;
}
if(a==b){
cout<<"输入的顶点不能相同"<<endl;
return ;
}
maxiz[a][b]=weight;
if(flag)maxiz[b][a]=weight;
edge++;
}
void eraseEdge(int a,int b){
if(check(a)||check(b)){
cout<<"输入的顶点不合法"<<endl;
return ;
}
maxiz[a][b]=Nodege;
if(flag)maxiz[b][a]=Nodege;
edge--;
}
int numberOfVertices(){
return point;
}
int numberOfEdges(){
return edge;
}
bool existsEdge(int a, int b){
return maxiz[a][b] != Nodege;
}
bool directed() const{
return !flag;
}
bool weighted() const{
return Nodege != 0;
}
int degree(int a) const {
if(directed()){
cout<<"该图为有向图"<<endl;
return -1;
}
if(check(a)){
cout<<"输入的顶点不合法"<<endl;
return -1;
}
int size = 0;
for(int i=1;i<=point;i++)if(maxiz[a][i]!=Nodege)size++;
return size;
}
int inDegree(int a) const {
if(directed()==false){
cout<<"该图为无向图"<<endl;
return -1;
}
if(check(a)){
cout<<"输入的顶点不合法"<<endl;
return -1;
}
int size = 0;
for(int i=1;i<=point;i++)if(maxiz[i][a]!=Nodege)size++;
return size;
}
int outDegree(int a) const {
if(directed()==false){
cout<<"该图为无向图"<<endl;
return -1;
}
if(check(a)){
cout<<"输入的顶点不合法"<<endl;
return -1;
}
int size = 0;
for(int i=1;i<=point;i++)if(maxiz[a][i]!=Nodege)size++;
return size;
}
void initReach(){
if(reach)delete []reach;
reach = new bool[point+1];
for(int i=1;i<=point;i++)reach[i]=false;
}
void bfs(int v=1);
void dfs(int v=1){
if(check(v)){
cout<<"输入的顶点不合法"<<endl;
}
initReach();
DFS(v);
}
private:
int** maxiz;
int Nodege;
int edge;
int point;
bool flag;
bool * reach;
void DFS(int v);
};
void graph::bfs(int v){
if(check(v)){
cout<<"输入的顶点不合法"<<endl;
}
queue<int> q ;
q.push(v);
reach = new bool[point+1];
for(int i=1;i<=point;i++)reach[i]=false;
reach[v]=true;
while(!q.empty()){
v = q.front();
q.pop();
for(int i=1;i<=point;i++){
if(maxiz[v][i]!=Nodege&&reach[i]==false){
cout<<v<<"->"<<i<<"\n";
q.push(i);
reach[i]=true;
}
}
}
}
void graph::DFS(int v){
reach[v]=true;
for(int i=1;i<=point;i++){
if(maxiz[v][i]!=Nodege&&!reach[i]){
cout<<v<<"->"<<i<<"\n";
DFS(i);
}
}
}
int main(){
graph g(4);
g.insertEdge(1,2);
g.insertEdge(2,3);
g.insertEdge(2,4);
g.insertEdge(3,4);
cout<<"图的顶点个数:"<<g.numberOfVertices()<<endl;
cout<<"图的边的个数:"<<g.numberOfEdges()<<endl;
cout<<"图的深度优先遍历: "<<endl;
g.dfs();
cout<<"图的广度优先遍历: "<<endl;
g.bfs();
}
输出结果
图的顶点个数:4
图的边的个数:4
图的深度优先遍历:
1->2
2->3
3->4
图的广度优先遍历:
1->2
2->3
2->4