头文件"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;
}