代码出处: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++;
}
}
}
}
}
}