资源简介

假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一个简单有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)。(注:图中不存在顶点到自己的弧)

资源截图

代码片段和文件信息

/*假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一个简单有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)。(注:图中不存在顶点到自己的弧)*/
#include
using namespace std;
class Edge
{
public:
int start;
int end;
int weight;
Edge(int st=0int en=0int w=0)
{
start=st;
end=en;
weight=w;
}
bool operator>(Edge oneEdge)
{
if(weight>oneEdge.weight)//通过权重比较边的大小
return true;
return false;
}
bool operator<(Edge oneEdge)
{
if(weight return true;
return false;
}
void Print()
{
   cout<<“边的始点为:“< }
};
class Graph
{
public:
int vertexnum;//图的顶点数目
volatile int edgenum;//图的边的数目
int *mark;//标记某顶点是否已经在生成树的集合中
Graph(int vn)//顶点的数目
{
vertexnum=vn;
edgenum=0;
mark=new int[vertexnum];
for(int i=0;i {
mark[i]=0;//都初始化为不在生成树集合中
}
}
~Graph()
{
delete []mark;
}
int Getvertexnum()
{
return vertexnum;
}
int Getedgenum()
{
return edgenum;
}
int StartVertex(Edge oneEdge)
{
return oneEdge.start;
}
int EndVertex(Edge oneEdge)
{
return oneEdge.end;
}
int WeightVertex(Edge oneEdge)
{
return oneEdge.weight;
}
virtual void SetEdge(int startint endint weight)=0;
    virtual void DelEdge(int startint end)=0;
};
class AdjGraph:public Graph
{
public:
int **m;//邻接矩阵的指针
AdjGraph(int vertexnumint **p):Graph(vertexnum)
{
int ij;
m=new int *[vertexnum];
for(i=0;i m[i]=new int [vertexnum];                  
for(i=0;i {
for(j=0;j {
m[i][j]=p[i][j];
}
}
}
~AdjGraph()
{
for(int i=0;i delete []m[i];
delete []m;
}
Edge FirstEdge(int oneVertex)//返回顶点的第一条边
{
Edge temp;
temp.start=oneVertex;
for(int i=0;i {
if(m[oneVertex][i]!=0)
{
temp.end=i;
temp.weight=m[oneVertex][i];
break;
}
}
return temp;
}
Edge NextEdge(Edge oneEdge)//返回与边有相同始点的下一条边
{
Edge temp;
temp.start=oneEdge.start;
for(int i=oneEdge.end+1;i {
if(m[oneEdge.start][i]!=0)
{
temp.end=i;
temp.weight=m[oneEdge.start][i];
break;
}
}
return temp;
}
void SetEdge(int startint endint weight)
{
if(m[start][end]==0)
{
edgenum++;
}
m[start][end]=weight;
}
voi

评论

共有 条评论