拓扑排序
来源:互联网 发布:洗数据 编辑:程序博客网 时间:2024/06/09 19:31
#include <stdio.h>#include<string.h>#define MAX 9999#define M 1000int indegree[MAX];typedef int ElemType;typedef struct //定义一个顺序栈{ ElemType data[M];//栈中最多可放M个元素 int top;//用来存放栈顶元素的下标,top为-1表示栈空} SeqStack;struct node{ int adjvex; node* next;} adj[MAX];void InitStack(SeqStack *s);//创建一个栈bool Push(SeqStack *s, ElemType x);//进栈操作bool Pop(SeqStack *s,ElemType *x);//出栈操作bool IsEmpty(SeqStack *s);//判断栈空int Create(node *adj,int n,int m);//邻接表建表函数,n代表定点数,m代表边数void print(int n);//邻接表打印函数void topsort(node *adj,int n);//拓扑排序int main(void){ int n; int m; printf("请输入顶点数及边数:"); scanf("%d%d",&n,&m); Create(adj,n,m); printf("输入的邻接表为:\n"); print(n); printf("拓扑排序结果为:\n"); topsort(adj,n); return 0;}void InitStack(SeqStack *s)//创建一个栈{ s->top=-1;}bool Push(SeqStack *s, ElemType x)//进栈操作{ if(s->top==M-1) return false; else { s->top++; s->data[s->top]=x; return true; }}bool Pop(SeqStack *s,ElemType *x) //出栈操作{ if(s->top==-1) return false; else { *x=s->data[s->top]; s->top--; return true; }}bool IsEmpty(SeqStack *s) //判断栈空{ if(s->top==-1) return true; else return false;}int Create(node *adj,int n,int m)//邻接表建表函数,n代表定点数,m代表边数{ int i; node *p; for(i=1; i<=n; i++) { adj[i].adjvex=i; adj[i].next=NULL; } for(i=1; i<=m; i++) { printf("请输入第%d条边:",i); int u,v; scanf("%d%d",&u,&v); p=new node; p->adjvex=v; p->next=adj[u].next; adj[u].next=p; } return 1;}void print(int n)//邻接表打印函数{ int i; node *p; for(i=1; i<=n; i++) { p=&adj[i]; while(p!=NULL) { printf("%d ",p->adjvex); p=p->next; } printf("\n"); }}void topsort(node *adj,int n)//拓扑排序{ SeqStack mystack; InitStack(&mystack); int x; node *p; memset(indegree,0,sizeof(indegree)); for(int i=1; i<=n; i++) { p=adj[i].next; while(p!=NULL) { indegree[p->adjvex]++; p=p->next; } } for(int i=1; i<=n; i++) { if(indegree[i]==0) Push(&mystack,i); } int count=0; while(!IsEmpty(&mystack)) { Pop(&mystack,&x); printf("%d ",x); count++; for(p=adj[x].next; p!=NULL; p=p->next) { int k=p->adjvex; indegree[k]--; if(indegree[k]==0) Push(&mystack,k); } } printf("\n"); if(count<n) printf("有回路\n");}
阅读全文
1 0
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- WIN7右键在目录当前打开命令行Cmd窗口
- R语言将层次聚类中的树分成簇
- 几点感想-20170611
- spark源码之sparkEnv(1)RPC通信
- Java实现-打劫房屋2
- 拓扑排序
- leetcode 260. Single Number III
- Problem C
- android开发艺术探索 学习笔记(二) Activity的启动模式
- eclipsed的C/C++环境配置
- Error:SSL peer shut down incorrectly
- C++ 17 —— 纯虚函数
- HTML5 发布测试版本,通过网页在线安装ipa和apkH
- Problem E