資源簡介
假設以鄰接矩陣作為圖的存儲結構,編寫算法判別在給定的有向圖中是否存在一個簡單有向回路,若存在,則以頂點序列的方式輸出該回路(找到一條即可)。(注:圖中不存在頂點到自己的弧)
代碼片段和文件信息
/*假設以鄰接矩陣作為圖的存儲結構,編寫算法判別在給定的有向圖中是否存在一個簡單有向回路,若存在,則以頂點序列的方式輸出該回路(找到一條即可)。(注:圖中不存在頂點到自己的弧)*/
#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
評論
共有 條評論