浅谈拓扑排序

来源:互联网 发布:java课程设计小游戏 编辑:程序博客网 时间:2024/06/05 21:05

拓扑排序概念:

拓扑排序主要用于有向图,对有向图进行拓扑排序后得到节点的线性序列,

该序列中的后继结点都依赖于前继节点。

拓扑排序工程应用:

对一副相互关联的工程项目有向图进行拓扑排序,如果能得到包含所有节点的拓扑排序这说明

该工程项目是可行的,否则不能执行,因为存在环路。

拓扑排序算法:

(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

程序实例:

// toplogysort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include<string>
#define  M 10
using namespace std;
typedef struct Node 
{


int index;//定点编号
struct Node *next; 
}node;

typedef struct  
{
int rdu;  //入度
int cdu;// 出度
char vale; // node value;
struct Node *next;
}Allnode;

Allnode a[M];

int findRduZeor(Allnode *a,int n)  //找到入度为0节点
{
int result=-1;
for(int i=0;i<n;i++)
if (a[i].rdu==0)
{
result=i;
a[i].rdu=-1;
break;
}


return result;
}

void toplogySort(Allnode *a,int n)
{
int i=0;
do 
{
int s=findRduZeor(a,n);
if (-1==s)
{
break;
}
//删除与该节点相互连接的边
cout<<a[s].vale<<"->";
node *p=a[s].next;
while (p)
{
(a[p->index].rdu)--;
p=p->next;
}
i++;
} while (i!=n);


if (i!=n)
{
cout<<"存在环路";
}
}
void main()
{
cout<<"begin construct imag"<<endl;
int n;
ifstream inf("toplogy.txt");  // 文件存放图的拓扑结构
if (!inf)
{
cout<<"open file is wrong"<<endl;
}
else
cout<<"open iftream is ok"<<endl;
string line;
getline(inf,line);
n=atoi(line.c_str());
cout<<"n="<<n<<endl;
getline(inf,line);
int j=0;
for (int i=0;i<n;i++)
{
a[i].vale=line[2*i];
a[i].cdu=0;
a[i].rdu=0;
a[i].next=NULL;
}
while (getline(inf,line))
{
node *s;
int  t1=line[0]-'0';
int  t2=line[2]-'0';
a[t1].cdu++;
a[t2].rdu++;
node *p=a[t1].next;
s=(node *)malloc(sizeof(node));
s->index=t2;
s->next=NULL;
if (p==NULL)
{
a[t1].next=s;
}
else
{
while (p->next)
{
p=p->next;
}
p->next=s;
}


}
cout<<"开始拓扑排序"<<endl;
toplogySort(a,n);


}
topylogy.txt:
5
A,B,C,D,E
0 4
0 1
1 2
1 4
2 3
3 4


执行结果:
begin construct imag
open iftream is ok
n=5
开始拓扑排序
A->B->C->D->E->请按任意键继续. . .
0 0
原创粉丝点击