数据结构:图

数据结构:图

源代码

#include<iostream>
#include<queue>
using namespace std;

class graph{
	public:
	graph(int point,int noEdge=0,bool flag=true){
		//nodege 代表两点之间没有边的情况,等于0是无权图,等于无穷大时为有权图
		//flag = false代表图为有向图,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){
		// 无权图是为 权可看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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值