DSOJ Topological Sort(拓扑排序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}


猜你喜欢

转载自blog.csdn.net/xhf0374/article/details/50360532
今日推荐