拓扑排序——判断有向图是否存在回路

头文件"AdjGraph.h"

#include<iostream>
#define VISITED 1
#define UNVISITED 0
#define EXIST 1
#define INEXIST 0
using namespace std;

class AdjGraph{
public:
	int **edge;
	int *mark;
	int *indegree;
	int vertexNum,edgeNum;
	AdjGraph(int v){
		vertexNum=v;
		edgeNum=0;
		edge=new int* [vertexNum];
		for(int i=0;i<vertexNum;i++)
			edge[i]=new int [vertexNum];
		mark=new int [vertexNum];
		indegree=new int [vertexNum];
		for(int i=0;i<vertexNum;i++){
			indegree[i]=0;
			mark[i]=UNVISITED;
		}
		for(int i=0;i<vertexNum;i++)
			for(int j=0;j<vertexNum;j++)
				edge[i][j]=INEXIST;
	}
	~AdjGraph(){
		delete [] mark;
		delete [] indegree;
		for(int i=0;i<vertexNum;i++)
			delete [] edge[i];
		delete [] edge;
	}
	void setedge(int v,int u){
		edge[v][u]=EXIST;
		edgeNum++;
		indegree[u]++;
	}
	bool TopSort(){
		//循环vertexNum次,每次标记一个入度为0的顶点
		for(int i=0;i<vertexNum;i++){
			int j;
			//若找到找到入度为0的顶点则跳出循环
			for(j=0;j<vertexNum;j++){
				if(indegree[j]==0 && mark[j]==UNVISITED)
					break;
			}
			if(j==vertexNum)
				return false;
			//删除顶点
			mark[j]=VISITED;
			//删除与顶点相关的边,和相关的顶点入度减1
			for(int k=0;k<vertexNum;k++){
				if(edge[j][k]==EXIST){
					edge[j][k]=INEXIST;
					edgeNum--;
					indegree[k]--;
				}
			}
		}
		return true;
	}
	void showLoop(){
		for(int i=0;i<vertexNum;i++)
			for(int j=0;j<vertexNum;j++)
				if(edge[i][j]==EXIST)
					cout<<"v"<<i+1<<"->"<<"v"<<j+1<<endl;
	}

};


源文件"main.cpp"

#include<iostream>
#include"AdjGraph.h"
using namespace std;

int main(){
	AdjGraph AG(6);
	AG.setedge(0,1);
	AG.setedge(0,2);
	AG.setedge(2,4);
	AG.setedge(4,5);
	AG.setedge(3,5);
	AG.setedge(5,2);//反向即为无环图
	if(AG.TopSort())
		cout<<"no loop"<<endl;
	else{
		cout<<"loop:"<<endl;
		AG.showLoop();
	}
	return 0;
}


该有向图为:V1->V2    V1->V3    V3->V5    V5->V6    V6->V3    V4->V6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值