图论的各种姿势(中) Toposort拓扑排序 学习笔记 POJ2367 CODE[VS]2833

没错就是中篇 因为还有好多图论姿势呢23333

定义:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。
就是说每个顶点出现且只出现一次;
若A在序列中排在B的前面,则在图中不存在从B到A的路径。
这里写图片描述
具体的实现:
1、每次找到入度为0的点,将其加入已排好序的队列队尾。
2、将当前入度为0的点以及它所连出去的边都在图中删掉。
3、重复1、2步直至图为空。

用一个数组记录每个点初始状态下的入度。
在初始的时候将入度为0的点加入宽度搜索的队列中。
在宽搜的时候,对于当前点,将其出边对应的所有点的入度都减一,然后顺便判断一下入度是否变成了0,如果是,就将该点加入队尾。
总之就是说,不断删点删边,同时把符合条件的点入队,直到图为空。
出队的顺序就是拓扑排序之后所得的序列。

例题(一) 输出拓扑序
链接:poj2367
题意: 知道一个数n, 然后n行,编号1到n, 每行输入几个数,该行的编号排在这几个数前面,输出一种符合要求的编号名次排序。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=100+10;
int ans[MAXN],in[MAXN];
bool vis[MAXN][MAXN];
int n,cnt;
queue<int>q;
void sort()
{
    while(!q.empty())
    {
        int tp=q.front();
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值