版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xhf0374/article/details/50360532
#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[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 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;
}