DSOJ Topological Sort(拓扑排序)

来源:互联网 发布:dnf战斗力基础属性算法 编辑:程序博客网 时间:2024/05/21 11:36

题目链接

#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;}elsebreak;}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;}elsebreak;}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[n];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 heapArc *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;}


0 0
原创粉丝点击