当前位置: 首页 > article >正文

洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言

题目:

https://www.luogu.com.cn/problem/B3644

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

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

输出 #1复制

2 4 5 3 1

思路:

拓扑排序可以利用dfs和bfs实现,我这里使用的是bfs

1.在输入的时候实现有向图和入度处理

2.bfs利用队列,将找到的入度为0的压入队首,在入度为0的节点寻找子节点,用一个循环遍历行,减去子节点的入度,为0的时候压入队列。

3.我们需要用一个vis状态数组来储存入度为0的节点,相当于删除节点

代码如下:

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct Node {
    int id = 0;
};
bool vis[5001];//记录点 
int n;
int G[5001][5001]; // 数组大小设为5001以允许索引0-5000,或保持5000但使用1-5000索引
Node num[5001];//结构体类型的数组,作为节点 
queue <int> q;

void check()//检查函数 
{
	    for (int i = 1; i <= n; i++) 
		{
        for (int j = 1; j <= n; j++) 
		{
            cout << G[i][j] << " ";
        }
        cout << endl;
    }
    for(int i = 1 ; i <= n ; i++) 
    {
    	cout << "节点: " << i << " id->" << num[i].id << endl;
	}
	cout << endl;

}


int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) 
	{
        int t;
        while (cin >> t && t != 0) 
		{
            G[i][t] = 1;
            num[t].id++;//入度

        }
    }
//	check();//检查
	for(int i = 1 ; i <= n ; i++)
	{
		if(num[i].id == 0)
		{
			q.push(i);
		}
	 } 
	while(!q.empty())
	{
		int head = q.front();
		q.pop();
		if(num[head].id == 0)
		cout << head << endl;
		 for (int k = 1; k <= n; k++) 
		 {
            if (G[head][k] == 1)// 遍历邻接节点并更新入度 
			{
                num[k].id--;//减去入度
                if (num[k].id == 0 && !vis[k]) 
				{
                    q.push(k);//入队
                    vis[k] = true;//标记已访问
                }
            }
         }
	}
    return 0;
}


http://www.kler.cn/a/445894.html

相关文章:

  • WIN10拖入文件到桌面,文件自动移动到左上角,导致桌面文件错乱
  • 简单工厂模式和策略模式的异同
  • 【计算机网络】期末考试预习复习|中
  • 单元测试使用记录
  • SSH连接成功,但VSCode连接不成功
  • vue+springboot+cas配置及cookie传递问题
  • git部分命令的使用
  • Hmsc包开展群落数据联合物种分布模型分析通用流程(Pipelines)
  • 如何快速构建Jmeter脚本
  • oracle AES CBC,128位密钥加解密方法
  • 【C++ DFS 图论】1519. 子树中标签相同的节点数|1808
  • 解决 Ubuntu 20.04 上因 postmaster.pid 文件残留导致的 PostgreSQL 启动失败问题
  • L24.【LeetCode笔记】 杨辉三角
  • 如何彻底删除电脑数据以防止隐私泄露
  • 【mac 终端美化】oh my zsh
  • GTID详解
  • 【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
  • 【Verilog】实验九 存储器设计与IP调用
  • 【论文复现】找出图像中物体的角点
  • 热更新解决方案4——xLua热补丁
  • [react] 优雅解决typescript动态获取redux仓库的类型问题
  • ES倒排索引
  • 全链路触达,Klaviyo 助力跨境电商打造数据驱动的智能化营销体验
  • 区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测
  • PDF无法打印!怎么办?
  • 数据结构_双向循环链表实战