DSOJ Topological Sort(拓扑排序)
2015-12-19 23:05
330 查看
题目链接
#include<stdio.h> //Topological Sort(利用小顶堆使同等条件下,编号小的顶点在前) #include<string.h> #include<stdlib.h> #define MAX 100 //最大的顶点个数 typedef struct arc { int index; struct arc *next; }Arc; typedef struct graph { int vexnum, arcnum; Arc List[MAX]; }Graph; void initial_graph(Graph *G) { int Vexnum, Arcnum, i; scanf("%d%d", &Vexnum, &Arcnum); G->vexnum = Vexnum; G->arcnum = Arcnum; for (i = 1; i <= G->vexnum; i++) { G->List[i].index = i; G->List[i].next = NULL; } } void create_graph(Graph *G) { int i, j, k; Arc *p; initial_graph(G); for (k = 1; k <= (G->arcnum); k++) { scanf("%d", &i); scanf("%d", &j); p = (Arc *)malloc(sizeof(Arc)); p->index = j; p->next = G->List[i].next; G->List[i].next = p; } } void calculate_degree(Graph *G, int *degree) //Calculate Indegree { int i; Arc *p; for (i = 1; i <= G->vexnum; i++) degree[i] = 0; for (i = 1; i <= G->vexnum; i++) { p = G->List[i].next; while (p) { degree[p->index]++; p = p->next; } } } void SiftDown_heap(int *a, int index, int n) //SiftDown { int i, j; a[0] = a[index]; i = index; j = 2 * i; while (j <= n) { if (j + 1 <= n&&a[j + 1] < a[j]) j = j + 1; if (a[0] > a[j]) { a[i] = a[j]; i = j; j = 2 * i; } else break; } a[i] = a[0]; } void SiftUp_heap(int *a, int index, int n) //SiftUp { int i, j; a[0] = a[index]; i = index; j = i / 2; while (j >= 1) { if (a[j] > a[0]) { a[i] = a[j]; i = j; j = i / 2; } else break; } a[i] = a[0]; } void create_heap(int *a, int n) //Create Samll Heap { int i; i = n / 2; while (i >= 1) { SiftDown_heap(a, i, n); i--; } } int heap_sort(int *a, int n) //Return the minimum { int temp; temp = a[1]; a[1] = a ; SiftDown_heap(a, 1, n - 1); return temp; } void Topo_sort(Graph *G) { int degree[MAX], i, j, a[MAX + 1],num = 0, min; //a is a small heap Arc *p; calculate_degree(G, degree); for (i = 1; i <= G->vexnum; i++) { if (degree[i] == 0) a[++num] = i; } create_heap(a, num); while (num > 0) { min = heap_sort(a, num); num--; printf("v%d ", min); p = G->List[min].next; while (p) { degree[p->index]--; if (!degree[p->index]) { a[++num] = p->index; SiftUp_heap(a, num, num); } p = p->next; } } printf("\n"); } int main() { Graph G; create_graph(&G); Topo_sort(&G); return 0; }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- HDU 3342
- 2367:Genealogical tree
- hdu 1285 确定比赛名次 (简单的拓扑排序)
- hdu 2049 产生冠军(拓扑排序)
- [BZOJ2330][SCOI2011][拓扑排序][强连通分量][Tarjan]Candy
- Course Schedule
- LeetCode Course Schedule II
- 【Leetcode】Course Schedule II #210
- poj1094 拓扑排序
- (转)拓扑排序
- [leetcode]Course Schedule
- poj_1094
- cf_290(div2)A,B,C
- 图论算法(1)--- 如何求每一个节点在DAG中的最大深度
- hdu 3342 拓扑排序
- hdu 2647 拓扑排序
- UVa 1572 拓扑排序 判断有向图是否有环
- UVa10305拓扑排序入门题 可做模板用