#include<iostream>
#include<stack>
#include<algorithm>
#define Status int
#define OK 1
#define ERROR 0
#define Max_Vertex_Num 20
#define InfoType int
#define VertexType char
using namespace std;
bool visited[Max_Vertex_Num];
Status(*VisitFunc)(VertexType v);
typedef struct ArcNode{
int adjvex;//该弧所指的向的顶点位置
struct ArcNode *nextarc;
InfoType *info;//权
}ArcNode;
typedef struct VNode{
VertexType data;//顶点信息
ArcNode *firstarc;
}VNode,AdjList[Max_Vertex_Num];
typedef struct{
AdjList vertices;
int vexnum, arcnum;//顶点数,弧数
//char kind;
}ALGraph;
Status Get_LocateVex(ALGraph G,char t)
{
for (int i = 0; i < G.vexnum;i++)
if (G.vertices[i].data == t)
return i;
return ERROR;
}
Status Create_DALGraph(ALGraph& G)//D
{
cout << "顶点数 弧数:";
cin >> G.vexnum >> G.arcnum;
cout << "顶点:";
for (int i = 0; i < G.vexnum; i++){
cin >> G.vertices[i].data;
G.vertices[i].firstarc = NULL;
}
cout << "边:" << endl;
for (int i = 0; i < G.arcnum; i++){
ArcNode* s = new ArcNode;
if (!s ) return ERROR;
VertexType vi, vj;
cin >> vi >> vj;
int ti = Get_LocateVex(G, vi);
int tj = Get_LocateVex(G, vj);
s->adjvex = tj;
s->nextarc = G.vertices[ti].firstarc;
G.vertices[ti].firstarc = s;
}
return OK;
}
Status Print_AdjList(ALGraph G)
{
cout << "*********************" << endl;
for (int i = 0; i < G.vexnum; i++){
cout << G.vertices[i].data;
ArcNode* p = G.vertices[i].firstarc;
while (p){
cout << "->" << G.vertices[p->adjvex].data;
p = p->nextarc;
}
cout << endl;
}
cout <<"*********************"<< endl;
return OK;
}
Status Find_InDegree(ALGraph G, int* indegree)
{
for (int i = 0; i < G.vexnum; i++)
*(indegree + i) = 0;
for (int i = 0; i < G.vexnum; i++)
for (ArcNode* p = G.vertices[i].firstarc; p; p = p->nextarc)
++indegree[p->adjvex];
return OK;
}
Status Topological_Sort(ALGraph G)
{
stack<int> S;
int indegree[Max_Vertex_Num];
Find_InDegree(G, indegree);
for (int i = 0; i < G.vexnum;i++)
if (!indegree[i]) S.push(i);
int count = 0;
cout << "Topological_Sort:" << endl;
while (!S.empty()){
cout << "->" << G.vertices[S.top()].data;
++count;
ArcNode* p = G.vertices[S.top()].firstarc;
for (S.pop(); p; p = p->nextarc){
if (!(--indegree[p->adjvex]))
S.push(p->adjvex);
}
}
if (count < G.vexnum) {
cout << "该图有回路!" << endl;
return ERROR;
}
cout << endl;
return OK;
}
Status Print(VertexType e)
{
cout << "->" << e;
return OK;
}
void main()
{
ALGraph G2;
Create_DALGraph(G2);
cout << "D_AdjList:" << endl;
Print_AdjList(G2);
DFSTraverse(G2, Print);
BFSTraverse(G2, Print);
Topological_Sort(G2);
system("Pause");
}
有向图的拓扑排序~TopologicalSort
最新推荐文章于 2022-08-18 15:02:14 发布