拓扑排序~C语言完整代码

拓扑排序~C语言完整代码对一个有向无环图 DirectedAcyc 简称 DAG G 进行拓扑排序 是将 G 中所有顶点排成一个线性序列 使得图中任意一对顶点 u 和 v 若边 u v E G 则 u 在线性序列中出现在 v 之前 通常 这样的线性序列称为满足拓扑次序 TopologicalO 的序列 简称拓扑序列 简单的说 由某个集合上的一个偏序得到该集合上的一个全序 这个操作称之为拓扑排序 拿个例子来说

#include<stdio.h> #include<stdlib.h> #define MaxVertexNum 100 #define ERROR 0 #define OK 1 #define FALSE 0 #define TRUE 1 typedef int Boolean; typedef int VertexType; Boolean visit[MaxVertexNum]; typedef struct node { int adjvex; struct node *next; }EdgeNode; typedef struct { VertexType vertex; EdgeNode *firstedge; }VertexNode; typedef VertexNode AdjList[MaxVertexNum]; typedef struct { AdjList adjlist; int n,e; }ALGraph; int FindVertex(ALGraph *G ,int e,int n) { int i; for(i=0;i<n;i++) { if(G->adjlist[i].vertex==e) { return i; } } return -1; } void create(ALGraph *G) //创建邻接表 { int i,j,k,w,v; EdgeNode *s; printf("读入顶点和边数"); scanf("%d %d",&G->n,&G->e); for(i=0;i<G->n;i++) { printf("建立顶点表"); fflush(stdin); scanf("%d",&G->adjlist[i].vertex); G->adjlist[i].firstedge=NULL; } printf("建立边表\n"); for(k=0;k<G->e;k++) { printf("读入(vi-vj)的顶点对序号"); scanf("%d %d",&i,&j); i=FindVertex(G,i,G->n); j=FindVertex(G,j,G->n); if(i==-1||j==-1) { printf("找不到顶点,请重新输入!\n"); printf("读入(vi-vj)的顶点对序号"); scanf("%d %d",&i,&j); i=FindVertex(G,i,G->n); j=FindVertex(G,j,G->n); } s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=(j); s->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=s; } } void TopoSort(ALGraph *G,int n) { int i,j,k,top,m=0; EdgeNode *p; int *d=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) //初始化数组 { d[i]=0; } for(i=0;i<n;i++) //统计各个顶点的入度情况,并把他们填入数组里面 { p=G->adjlist[i].firstedge; while(p!=NULL) { j=p->adjvex; d[j]++; p=p->next; } } top=-1; for(i=0;i<n;i++) //先找出里面入度是0的顶点 { if(d[i]==0) { d[i]=top; top=i; } } while(top!=-1) { j=top; top=d[top]; printf("%d ",j); m++; //统计顶点 p=G->adjlist[j].firstedge; while(p) { k=p->adjvex; //相l连接的顶点 d[k]--; //相连接的顶点入度减1 if(d[k]==0) //如果发现入度为0的新顶点,从该顶点出发 { d[k]=top; top=k; } p=p->next; } } if(m<n) printf("\n有回路!\n"); free(d); } void main() { ALGraph *G=(ALGraph *)malloc(sizeof(ALGraph)); EdgeNode *p; create(G); int i; printf("其邻接表为('->'表示两个之间有连接):\n"); for(i=0;i<G->n;i++) { p=G->adjlist[i].firstedge; printf("%d->",G->adjlist[i].vertex); while(p!=NULL) { printf("%d->",G->adjlist[p->adjvex].vertex); p=p->next; } printf("\n"); } printf("拓扑排序为:\n"); TopoSort(G,G->n); } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233462.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号