AOV网的所有拓扑排序实现的代码

代码出处:http://www.docin.com/p-63414702.html

讲解了怎么实现拓扑排序的全部序列的输出,利用深搜的思想。

#include <cstdio>

#include <cstring>

#include <malloc.h>

using namespace std;

typedef struct Node

{

int Ldata;
//邻接点信息 

Node *nextarc;
//指向下一个节点 

}Node;
//邻接表中的结点类型 

typedef struct{

int Tdata;
//顶点信息 

int intdegree;
//顶点入度 

Node *first;
//指向第一个邻接点 

}Tnode,adjlist[100];
//表头节点类型 

typedef struct {

adjlist vextives;

int v,e;
//邻接表类型 

}ALgraph;

ALgraph creatgraph()

{

int m,n,i,j,k;

adjlist G;

Node *L;

printf(“请输入顶点数:”);

scanf(“%d”,&m);

for(int i=1;i<=m;i++)
//对邻接表的所有顶点初始化 

{

G[i].intdegree = 0;
//顶点的入度置为0 

G[i].first = NULL;
//将指向下一个节点置空 

}

printf(“请输入边数:”);

scanf(“%d”,&n);

printf(“请输入边的信息:”);

for(int i=1;i<=n;i++)//依次读入所有边的信息,并存储在邻接表中 

{

scanf(“%d %d”,&j,&k);

L = (Node *)malloc(sizeof(Node));
//分配节点 

L->Ldata = k;

L->nextarc = G[j].first;

G[j].first = L;
//讲解点插入邻接表中 

G[k].intdegree++;
//使节点的入度加1 

}

ALgraph al;
//邻接表创建图 

for(int i=1;i<=m;i++)

{

al.vextives[i]=G[i];

}

al.v = m;

al.e = n;

return al;

}

void Topusort(ALgraph G,int n);

int show[50];
//将入度为0的顶点存入 

int g = 0;
//记录存入show[]的顶点数 

int k = 50;
//标记图是否存在回路 

int t= 0;
//记录一个有向无环图共有多少拓扑排序 

int visited[50];
//标记图中顶点是否被访问过 

int main()

{

ALgraph alg;

alg = creatgraph();

for(int i=1;i<50;i++)
//将所有节点标记为为未访问 

visited[i]=0;

Topusort(alg,1);

printf(“\n此AOV网共有%d个拓扑排序\n”,t); 

return 0;

}

void Topusort(ALgraph G,int n)

{

int i,m=0;

int r[50];

Node *s;

int flag = 0;

if(k==1)

return ;

k =50;

for(i=1;i<=G.v;i++)

{

if(visited[i]==0)

{

flag = 1;

break;

}

}

if(flag == 0)

{

for(i = 1;i<=g;i++)

{

printf(“V%d “,show[i]);

}

printf(“\n”);

t++;

}

else

{

for(i = 1;i<=G.v;i++)

{

if(G.vextives[i].intdegree == 0&&visited[i]==0)

{

k=0;

break;

}

}

if(k!=0)

{

printf(“图中存在环,无法拓扑排序\n”);

k=1;

return ; 

}

else

{

for(i=1;i<=G.v;i++)

{

if(G.vextives[i].intdegree==0&&visited[i]==0)

{

g++;

show[g]=i;

visited[i]=1;

s=G.vextives[i].first;

while(s!=NULL)

{

int a=s->Ldata;

m++;

r[m]=a;

G.vextives[a].intdegree–;

s=s->nextarc;

}

Topusort(G,n+1);

visited[i]=0;

g–;

for(int j=1;j<=m;j++)

{

G.vextives[r[j]].intdegree++;

}

}

}

}

}

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/weinierzui/article/details/44888055
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞