拓扑排序概念:
拓扑排序主要用于有向图,对有向图进行拓扑排序后得到节点的线性序列,
该序列中的后继结点都依赖于前继节点。
拓扑排序工程应用:
对一副相互关联的工程项目有向图进行拓扑排序,如果能得到包含所有节点的拓扑排序这说明
该工程项目是可行的,否则不能执行,因为存在环路。
拓扑排序算法:
(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;
//
#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
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->请按任意键继续. . .
open iftream is ok
n=5
开始拓扑排序
A->B->C->D->E->请按任意键继续. . .