拓扑排序之邻接表实验
来源:互联网 发布:制作条形码的软件 编辑:程序博客网 时间:2024/05/17 23:53
拓扑排序之邻接表实验
标签:拓扑排序
方法一:
FindInDegree()函数对各个顶点求入度,保存在indegree[]数组中。
#include <stdio.h>#include <stdlib.h>#include <stack>using namespace std;#define M 20typedef char vertextype;int indegree[M];typedef struct node{ int adjvex; struct node *next;}edgenode;typedef struct de{ edgenode *FirstEdge; vertextype vertex;}vertexnode;typedef struct{ vertexnode adjlist[M]; int n,e;}AovGraph;void creat(AovGraph *g, char *filename){ int i, j, k; edgenode *s; FILE *fp; fp = fopen(filename, "r"); if(fp){ fscanf(fp, "%d %d", &g->n, &g->e); for(i = 0; i < g->n; i++){ fscanf(fp, "%1s", &g->adjlist[i].vertex); g->adjlist[i].FirstEdge = NULL; } for(k = 0; k < g->e; k++){ s = (edgenode*)malloc(sizeof(edgenode)); fscanf(fp, "%d %d", &i, &j); s->adjvex = j; s->next = g->adjlist[i].FirstEdge; g->adjlist[i].FirstEdge = s; } }}void FindInDegree(AovGraph g, int indegree[M]){ for(int i = 0; i < g.n; i++){ int total = 0; for(int j = 0; j < g.n; j++){ edgenode *p = g.adjlist[j].FirstEdge; while(p){ if((p->adjvex + '0') == g.adjlist[i].vertex) total++; ///'0' p = p->next; } } indegree[i] = total; }}void print(AovGraph g){ int i; FindInDegree(g, indegree); for(i = 0; i < g.n; i++){ printf("indegree(%d) %c", indegree[i], g.adjlist[i].vertex); edgenode *p = g.adjlist[i].FirstEdge; while(p){ printf("-->%d", p->adjvex); p = p->next; } printf("\n"); }}void Tsort(AovGraph g){ stack <int> S; int i, k; FindInDegree(g, indegree); for(i = 0; i < g.n; i++) if(!indegree[i]) S.push(g.adjlist[i].vertex - '0'); /// int countv = 0; while(!S.empty()){ i = S.top(), S.pop(); printf("%c", g.adjlist[i].vertex); ++countv; for(edgenode *p = g.adjlist[i].FirstEdge; p; p = p->next){ k = p->adjvex; if(!(--indegree[k])) S.push(k); } } if(countv < g.n) printf("failed\n");}int main(){ AovGraph g; creat(&g, "topo.txt"); print(g), printf("\n"); Tsort(g), printf("\n"); return 0;}
方法二:
在邻接表头结点中增加一个存放顶点入度的域,在读图的同时计算各顶点的入度。
#include <stdio.h>#include <stdlib.h>#include <stack>using namespace std;#define M 20typedef char vertextype;typedef struct node{ int adjvex; struct node *next;}edgenode;typedef struct de{ edgenode *FirstEdge; vertextype vertex; int id; //顶点的入度}vertexnode;typedef struct{ vertexnode adjlist[M]; int n,e;}AovGraph;void creat(AovGraph *g, char *filename){ int i, j, k; edgenode *s; FILE *fp; fp = fopen(filename, "r"); if(fp){ fscanf(fp, "%d %d", &g->n, &g->e); for(i = 0; i < g->n; i++){ fscanf(fp, "%1s", &g->adjlist[i].vertex); g->adjlist[i].FirstEdge = NULL; g->adjlist[i].id = 0; //入度初始化为0 } for(k = 0; k < g->e; k++){ s = (edgenode*)malloc(sizeof(edgenode)); fscanf(fp, "%d %d", &i, &j); s->adjvex = j; g->adjlist[j].id++; //顶点j的入度加1 s->next = g->adjlist[i].FirstEdge; g->adjlist[i].FirstEdge = s; } }}void print(AovGraph g){ int i; for(i = 0; i < g.n; i++){ printf("indegree(%d) %c", g.adjlist[i].id, g.adjlist[i].vertex); edgenode *p = g.adjlist[i].FirstEdge; while(p){ printf("-->%d", p->adjvex); p = p->next; } printf("\n"); }}void Tsort(AovGraph g){ stack <int> S; int i, k; for(i = 0; i < g.n; i++) if(!g.adjlist[i].id) S.push(g.adjlist[i].vertex - '0'); /// int countv = 0; while(!S.empty()){ i = S.top(), S.pop(); printf("%c", g.adjlist[i].vertex); ++countv; for(edgenode *p = g.adjlist[i].FirstEdge; p; p = p->next){ k = p->adjvex; if(!(--g.adjlist[k].id)) S.push(k); } } if(countv < g.n) printf("failed\n");}int main(){ AovGraph g; creat(&g, "topo.txt"); print(g), printf("\n"); Tsort(g), printf("\n"); return 0;}
数据文件:
实验结果:
阅读全文
0 0
- 拓扑排序之邻接表实验
- 图之拓扑排序(邻接表存储)
- 邻接表拓扑排序
- 邻接表拓扑排序
- 数据结构上机实验--有向图邻接表的建立,深度广度搜索及拓扑排序
- poj 1094 拓扑排序+邻接表
- 邻接表实现的拓扑排序
- 拓扑排序_基于邻接表
- Reward(拓扑排序+邻接表)
- hdu1285 拓扑排序+邻接矩阵(邻接表)
- 拓扑排序(基于邻接表实现)
- Reward 2647 (拓扑排序+邻接表)
- 图 邻接链表的拓扑排序
- 拓扑排序(C语言 邻接表)
- 邻接表实现--图的拓扑排序
- 邻接表存储的拓扑排序
- 利用邻接表进行拓扑排序
- 数据结构(C语言版)规范代码之图(邻接表的拓扑排序)
- break语句
- 什么是http,什么是tomcat,什么是Servlet
- 细说mysql索引
- Java线程池的基本原理
- 分布式开发--分布式内存管理
- 拓扑排序之邻接表实验
- 什么是单例设计模式? (转)
- 爱上WordPress系列教程:(一)WordPress环境准备与安装
- Service and Privacy Policy
- Verilog RTL 代码设计新手上路
- mysql timezone exception fix
- 激活函数-sigmoid
- 编写代码模拟手机与SIM卡组合的关系
- 控制跳转语句