C++ 拓扑排序

📋 个人简介

🎉大家好,我是3月份新人榜排名第三的 ༺Blog༒Hacker༻
💬支持我:点赞👍+收藏⭐️+留言📝
🌺格言:༺永做优质༒programmer༻

📣拓扑排序

🍀题目描述
❄️当且仅当一个有向图为有向无环图(DAG)时,才能得到对应于该图的拓扑排序。每一个有向无环图都至少存在一种拓扑排序。

❄️其拓扑排序为其所有结点的一个线性排序。该排序满足这样的条件——对于图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。

❄️把AOV网(用定点表示活动,用弧表示活动间优先关系的有向图)络中各个顶点按照它们互相之间的优先关系排列成一个线性序列的过程叫做拓扑排序。

☘️输入格式
❄️第一行为整数n和m,用空格隔开;

❄️接下来m行,每行有两个整数u,v,表示一条有向边从u指向v。

☘️输出格式
❄️一行n个整数,之间用空格隔开,表示有向图的拓扑排序。

☄️样例数据

input
12 16
1 2
1 4
1 12
2 3
4 5
1 3
3 5
3 7
3 8
9 12
9 10
9 11
11 6
6 8
10 12
5 7

output
1 2 3 4 5 7 9 10 11 6 8 12

🌐数据规模与约定

1<=n,m<=100

💯CODE

#include<bits/stdc++.h>
using namespace std;
int map[105][105];
int n,m;
int top[105],rudu[105];
void topsort()
{
  int h,num=0,i,j,k;
  for(k=1;k<=n;k++)
  {
    for(i=1;i<=n;i++)
    {
      if(rudu[i]==0)
      {
        h=i;
	    break;
	  }
    }
    num++;
    top[num]=h;
    rudu[h]=-1;
    for(j=1;j<=n;j++)
    {
      if(map[h][j]==1)
        rudu[j]--;
    } 
  }
}
int main()
{
  cin>>n>>m;
  int i,j,x,y;
  for(i=1;i<=m;i++)
  {
    cin>>x>>y;
    map[x][y]=1;
    rudu[y]++;
  }
  topsort();
  for(j=1;j<=n;j++)
    cout<<top[j]<<" ";
  cout<<endl;
  return 0;
}

🌺朋友们,点赞是我更新的动力,明天再见,拜拜!!!

在这里插入图片描述

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
拓扑排序是一种对有向无环图(Directed Acyclic Graph,简称DAG)中的节点进行排序的算法。在拓扑排序中,每个节点都有一个入度(InDegree)值,表示有多少条边指向该节点。拓扑排序的目标是按照节点的入度顺序将节点排序,使得每个节点的前驱节点都排在它的前面。 在给出的代码中,实现了一个拓扑排序算法。首先,通过构建邻接表来表示有向图,并初始化每个节点的入度为0。然后,从入度为0的节点开始,依次将节点加入拓扑序列中,并将其后继节点的入度减1。重复这个过程,直到所有节点都被加入到拓扑序列中,或者图中存在有向环。 具体步骤如下: 1. 定义一个队列node,用于存储当前入度为0的节点。 2. 遍历所有节点,将入度为0的节点加入队列node中。 3. 初始化拓扑序列的顶点个数number为0。 4. 当队列node不为空时,执行以下操作: - 弹出队列node中的一个节点u。 - 将number加1,表示拓扑序列顶点个数加1。 - 遍历节点u的所有后继节点v,将v的入度减1。 - 如果v的入度减为0,则将v加入队列node中。 5. 判断是否能产生拓扑序列,即判断n是否等于number。如果相等,则能产生拓扑序列;否则,存在有向环,无法产生拓扑序列。 综上所述,给定的C代码实现了一个拓扑排序算法,可以用于对有向无环图进行拓扑排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++拓扑排序](https://blog.csdn.net/qq_36935691/article/details/113853028)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [c++拓扑排序](https://blog.csdn.net/lukehong_/article/details/108208337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༺Blog༒Hacker༻

您的鼓励将是我更新最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值