您的位置:首页 > 其它

有向图的拓扑排序

2017-03-19 20:07 141 查看
拓扑排序的算法实现

描述:

首先找到入度为0的顶点,然后再将它的直接后继的所有顶点的入度数减1,然后输出该点,再找入度为0,如此循环,一直到找不到入度为0 的点。如果整个图的所有顶点都找到了,那么G中就没有有向环,而且输出的序列就是一个拓扑有序的序列。

但是由于可能存在同时两个点的入度都为0,所以拓扑序列不唯一。

#include <iostream>
#include <cstdio>
using namespace std;
struct Edge{
int dest;//表示目标顶点
int value;//边的权值
Edge * link;//链表下一元素
};
void TopologicalSort(int n,Edge* edge
){
int degree
;//计算入度数,然后加到degree数组中
memset(degree, 0, n*sizeof(int));
Edge *l;
for(int i=0;i<n;i++){
l=edge[i];
while(l){
degree[l->dest]++;
l=l->link;
}
}
//top表示入度为0 的顶点的栈的栈顶
int top=-1;
for(int i=0;i<n;i++){
if(degree[i]==0){
degree[i]=top;
top=i;
}
}
for(int i=0;i<n;i++){
if(top==-1){
//表示没有入度为0的顶点
cout<<"存在有向环"<<endl;
return;
}
else{
int j=top;
top=degree[top];
cout<<j<<endl;
l=edge[j];
while(l){
if(--degree[l->dest]==0){
//新的入度为0的点
degree[l->dest]=top;
top = l->dest;
}
//下一个后继点
l=l->link;
}
}
}
}
int main(){
int n;//顶点个数
cin>>n;
Edge* edge
;
int u,v;
Edge *l;
//初始化邻接表
for(int i=0;i<n;i++){
edge[i]=NULL;
}
while(cin>>u>>v){
l=new Edge;
l->dest=v;
l->link=edge[u];
edge[u]=l;
}
TopologicalSort(n, edge);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法