C语言-算法-拓扑排序

【模板】拓扑排序 / 家谱树

题目描述

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。

输入格式

1 1 1 行一个整数 N N N 1 ≤ N ≤ 100 1 \le N \le 100 1N100),表示家族的人数。接下来 N N N 行,第 i i i 行描述第 i i i 个人的后代编号 a i , j a_{i,j} ai,j,表示 a i , j a_{i,j} ai,j i i i 的后代。每行最后是 0 0 0 表示描述完毕。

输出格式

输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。

样例 #1

样例输入 #1

5
0
4 5 1 0
1 0
5 3 0
3 0

样例输出 #1

2 4 5 3 1

代码

#include <stdio.h>
#include <stdlib.h>
void enqueue(int x); // 入队函数
int dequeue(); // 出队函数
void topo_sort(); // 拓扑排序函数
#define MAXN 1000
int N, G[MAXN][MAXN]; // 邻接矩阵表示的图
int indegree[MAXN]; // 入度数组
int Q[MAXN]; // 队列相关变量
int head = 0, tail = 0;

int main(int argc, char *argv[])
{
   
	int i, v;
	scanf("%d", &N);
	
	for (i = 1; i <= N; i++)
	{
   
		while (scanf("%d", &v) && v != 0)
		{
   
			G[i][v] = 1; // 存在一条从i到v的边,v是i的后代
			indegree[v]++; // v的入度加一
		}
	}
	topo_sort();
	
	return 0;
}

void enqueue(int x) // 入队函数
{
   
	Q[tail++] = x;
}

int dequeue() // 出队函数
{
   
	return Q[head++];
}

void topo_sort() // 拓扑排序函数
{
   
	int i, u, v;
	for (i = 1; i <= N; i++)
	{
   
		if (indegree[i] == 0)
		{
   
			enqueue(i); // 将入度为0的人加入队列
		}
	}
	while (head != tail) // 队列不为空
	{
   
		u = dequeue(); // 从队列中取出(入度为0,即为祖先)
		printf("%d ", u);
		for (v = 1; v <= N; v++)
		{
   
			if (G[u][v] == 1)
			{
   
				indegree[v]--;
				if (indegree[v] == 0)
				{
   
					enqueue(v);
				}
			}
		}
	}
}

相关推荐

  1. C语言-算法-拓扑排序

    2024-01-24 22:50:03       55 阅读
  2. 算法拓扑排序

    2024-01-24 22:50:03       47 阅读
  3. 拓扑排序(算法篇)

    2024-01-24 22:50:03       28 阅读
  4. c语言排序算法

    2024-01-24 22:50:03       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-24 22:50:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-24 22:50:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-24 22:50:03       82 阅读
  4. Python语言-面向对象

    2024-01-24 22:50:03       91 阅读

热门阅读

  1. 猜数字游戏(C语言代码)

    2024-01-24 22:50:03       43 阅读
  2. 模块化、系统化、功能化

    2024-01-24 22:50:03       58 阅读
  3. SpringCloud面经

    2024-01-24 22:50:03       40 阅读
  4. springboot切面获取参数转为实体对象

    2024-01-24 22:50:03       56 阅读
  5. 计算机网络常见故障种类及检查方法

    2024-01-24 22:50:03       38 阅读
  6. C语言使用了没定义的变量会有什么现象?

    2024-01-24 22:50:03       52 阅读
  7. c# 继承 new,base的使用

    2024-01-24 22:50:03       51 阅读
  8. LightDB - oracle_fdw join下推增强【24.1】

    2024-01-24 22:50:03       50 阅读
  9. oracle 字符集

    2024-01-24 22:50:03       58 阅读
  10. 为什么写进MySQL里的数据顺序乱了?

    2024-01-24 22:50:03       62 阅读