有向图的拓扑排序~TopologicalSort

#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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值