AOV网和Topo排序

来源:互联网 发布:python与 shell 编辑:程序博客网 时间:2024/05/29 09:36

1. 代码

#include<stdio.h>#include<stdlib.h>#define MAX_VEX 100//表结点 typedef struct node {int adjvex;//邻接顶点域 struct node* next; //指向下一顶点的指针域 }ARCNODE;typedef struct  {ARCNODE *firstarc;//边表头节点 int vertex;//顶点域,存储入度 }VEXNODE;VEXNODE adjlist[MAX_VEX];//创建邻接表 int creat(){int vexnum, edgnum;int i;int v1, v2;printf("输入顶点数,边数(vexnum,edgnum)=");scanf("%d,%d",&vexnum, &edgnum);for(i=1;i<=vexnum;i++){adjlist[i].vertex=0;adjlist[i].firstarc = NULL;}ARCNODE *ptr;for(i=1;i<=edgnum;i++){ptr=(ARCNODE*)malloc(sizeof(ARCNODE));printf("(v1,v2)=");scanf("%d,%d",&v1,&v2);ptr->adjvex=v2;ptr->next=adjlist[v1].firstarc;adjlist[v1].firstarc=ptr;adjlist[v2].vertex++; /*//无向图还要加上 ptr=(ARCNODE*)malloc(sizeof(ARCNODE)); ptr->adjvex=v1;ptr->next=adjlist[v2].firstarc;adjlist[v2].firstarc=ptr;*/} return vexnum;}/*拓扑排序 1. 在网上选取没有前驱(入度为0)的顶点,输出之;2. 删除该顶点,以及该顶点出发的全部边;3. 重复1,2,直至不存在入度为0的顶点 */void toposort(int vexnum) {//队列,将入度为0的顶点入度 int queue[vexnum+1];int i;int front, rear;front=rear=0;int sum=0;//用于计数,以判断结束时时顶点是否全部输出(topo排序是否存在) for(i=1;i<=vexnum;i++) if(adjlist[i].vertex==0){rear++;queue[rear]=i;}printf("排序结果: ") ;while(front!=rear){printf("%d  ",queue[++front]);//输出队首 sum++;//ARCNODE *p=adjlist[queue[front]].firstarc;while(p){adjlist[p->adjvex].vertex--;if(adjlist[p->adjvex].vertex==0){queue[++rear]=p->adjvex;}p=p->next;}}if(sum<vexnum)printf("\nnot a set of partial order!\n");}int main(){int vexnum=creat();toposort(vexnum); return 0;}

2. 结果

原创粉丝点击