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

来源:互联网 发布:知到智慧树形势与政策 编辑:程序博客网 时间:2024/06/07 00:49

头文件"AdjGraph.h"

#include<iostream>#define VISITED 1#define UNVISITED 0#define EXIST 1#define INEXIST 0using 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;//删除与顶点相关的边,和相关的顶点入度减1for(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

0 0
原创粉丝点击