您的位置:首页 > 运维架构

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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DSOJ 拓扑排序