首页 > 其他分享 >洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言(链表队列写法)

洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言(链表队列写法)

时间:2024-12-17 23:29:31浏览次数:7  
标签:洛谷 temp int indegree adjList VNode 链表 newNode 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

代码如下:

#include<iostream>

#include<queue>

using namespace std;

int n; 

int indegree[5000];

queue <int> q;

struct VNode{

 int data;// 存储相邻顶点的编号

 VNode *next;// 在结构体里面创建一个指向自己结构体类型的指针(指向下一个VNode的指针,形成链表) 

};

VNode* adjList[5000];// 邻接表数组,存储图的边信息

void init()

{

 for(int i = 1 ; i <= n ; i++)

 {

  adjList[i] = NULL;

 }

}

void addEdge(int src,int dest)

{

 VNode* newNode = (VNode *)malloc(sizeof(VNode));//创建一个VNode* 类型的newNode指针 

 newNode->data = dest;//将新指针连接上头(箭头指向的为头)点 

 

 newNode->next = adjList[src];

 adjList[src] = newNode;

}

int main(void)

{

 cin >> n;

 init();//初始化邻接表数组 

 for(int i = 1 ; i <= n ; i++)

 {

  int t;

  while(cin >> t && t != 0)

  {

   addEdge(i,t);//创建链表

   indegree[t]++; 

  }

 }

 

 for(int i = 1 ; i <= n ; i++)//将入度为0的点入队列 

 {

  if(indegree[i] == 0)

  {

   q.push(i);

  }

 }

 while(!q.empty())

 {

  int head = q.front();//取出头节点

  q.pop();

  cout << head << " ";//输出该节点

  VNode* temp = adjList[head];

  while(temp != NULL)

  {

   int child = temp -> data;//遍历到下一个节点

   indegree[child]--;

   if(indegree[child] == 0)

   {

    q.push(child);

    }

      temp = temp->next;

   } 

   

 } 

 return 0;

 }

标签:洛谷,temp,int,indegree,adjList,VNode,链表,newNode,C语言
From: https://blog.csdn.net/zqystca/article/details/144546989

相关文章

  • 关于C语言中指针的使用的练习
    #include<stdio.h>#include<stdlib.h>intmain(){char*arr=NULL;intsize,new_size;//动态分配初始内存printf("Entertheinitialsizeofthearray:");scanf("%d",&size);arr=(char*)malloc(s......
  • C语言关于return在循环语句中的使用(求一个数是否为素数的过程中的思考)
    intjk(inta)//定义一个jk函数判断a是否是素数,是返回1,不是则返回0.{ inti;if(a<2){return0;} elseif(a==2) { return1; } else { for(i=2;i<=a-1;i++) { if(a%i==0) { return0; } } return1; } }intmain(......
  • 【C语言】打牌游戏
    相信你是最棒哒!!!文章目录题目描述 正确代码总结题目描述 Suneet和Slavic玩一个卡牌游戏。游戏规则如下:每张卡片的整数值在 1 和 10之间。每位玩家获得 2 张面朝下的卡片(因此玩家不知道自己的卡片)。游戏是回合制的,且 恰好进行两轮。在每轮中,两位玩家随......
  • C语言单向循环链表和双向循环链表
     单向循环链表#ifndef__TEST_H__#define__TEST_H__#include<stdio.h>#include<stdlib.h>typedefintdataType;typedefstructnode{ union { intlen; dataTypedata; }; structnode*next;}loopLink,*looplinkPtr;looplinkPtrcreat();intemp......
  • 【C语言】拆数字组成最大数
    相信你是最棒哒!!!文章目录题目描述正确代码法一注释版简洁版法二注释版简洁版题目描述任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入1593,则输出为9531。输入描述自然数n输出描述各位数字组成的最大数样例输入1593样例输出9531......
  • 【C语言】百钱百鸡问题
    相信你是最棒哒!!!文章目录题目描述正确代码注释版简洁版总结题目描述中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?无输入输出描述给出所有的解,每组解占一行解的顺......
  • 20241217每日一题洛谷P1803
    普及-每日一题洛谷P1683题目描述现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个及以上的......
  • 【数据】链表
    Python链表详解(csdn.net)【链表与数组】数组:数据支持动态进行扩容,向数组内添加数据时内存已满,则python会开辟更大的内存空间,然后将现有元素复制到新的内存块中,然后添加新元素。  扩容操作通常涉及内存分配和元素复制,这可能会导致性能下降,特别是在频繁进行插入和删除操作的......
  • 复杂链表的复制 剑指offer
    题目描述        请实现函数ComplexListNode*Clone(ComplexListNode*pHead),复制一个复杂链表。在复杂链表中,每个节点除了有一个m_pNext指针指向下一个节点,还有一个m_pSibling指针指向链表中的任意节点或者nullptr。        节点的C++定义如下: 代......
  • 二叉搜索树与双向链表 剑指offer
    题目描述        输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。比如,输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。        树节点的定义如下: 题目分析      ......