题目描述

众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫。
有一天,TT 在 B 站上观看猫猫的比赛。一共有 N 只猫猫,编号依次为1,2,3,…,N进行比赛。比赛结束后,Up 主会为所有的猫猫从前到后依次排名并发放爱吃的小鱼干。不幸的是,此时 TT 的电子设备遭到了宇宙射线的降智打击,一下子都连不上网了,自然也看不到最后的颁奖典礼。
不幸中的万幸,TT 的魔法猫将每场比赛的结果都记录了下来,现在他想编程序确定字典序最小的名次序列,请你帮帮他。

Input

输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示猫猫的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即编号为 P1 的猫猫赢了编号为 P2 的猫猫。
Output
给出一个符合要求的排名。输出时猫猫的编号之间有空格,最后一名后面没有空格!

其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名

Sample Input

4 3
1 2
2 3
4 3

Sample Output

1 2 4 3

解题思路

本题属于典型的拓扑排序问题,直接使用Kahn算法求解即可。
首先需要两个队列,一个用来保存每次入度为0的点集,另一个用来保存排好的序。由于题目要求编号小的数据在前面输出,那么第一个集合需要使用优先级队列来保存,第二个可以使用vector来保存。
先遍历所有点,将入度为0的点加入优先级队列,然后从中取出一个点并删除,将该店加入vector中,并将该点连接的点的入度-1,再判断这些点是否入度为0,若为0则加入优先级队列。最后依次输出vector中的元素。

代码

#include<iostream>
#include<queue>
#include<vector>
#include<utility>
#include<cstring>
using namespace std;
const int maxm=510,maxn=1e6;
int head[maxm],in_deg[maxm];//记录每一个点的入度
int N,M,p1,p2;
int tot=0;
struct Edge
{int u,v,nxt;//出发点,到达点,权值,下一个点
}e[maxn];
void addedge(int u,int v)
{e[tot].u=u;e[tot].v=v;in_deg[v]++;e[tot].nxt=head[u];head[u]=tot;tot++;
}
priority_queue<pair<int,int> > q;//优先级队列
vector<int> t;
void init()
{while(q.size()) q.pop();//清空队列 while(t.size()) t.pop_back();//清空vector tot=0; for(int i=1;i<=N;i++){head[i]=-1;in_deg[i]=0;}
}
int main()
{std::ios::sync_with_stdio(false);while(cin>>N>>M){init();//初始化数据 for(int i=0;i<M;i++){cin>>p1>>p2;addedge(p1,p2);} for(int i=1;i<=N;i++)if(in_deg[i]==0)  q.push(make_pair(-i,i));while(q.size()){int m=q.top().second; q.pop();t.push_back(m);for(int i=head[m];i!=-1;i=e[i].nxt){int y=e[i].v;in_deg[y]--;if(in_deg[y]==0)  q.push(make_pair(-y,y));}}for(int i=0;i<t.size()-1;i++)cout<<t[i]<<" ";cout<<t[t.size()-1]<<endl;} return 0;
}

拓扑排序-Kahn算法相关推荐

  1. 拓扑排序----Kahn算法和字典序最小的拓扑排序

    一.拓扑排序定义: 二.卡恩算法(Kahn): 1.Kahn算法介绍: 有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点. 证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所 ...

  2. (数据结构)有向图的拓扑排序 Kahn算法

    拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中,vi必须出现在vj的前面. 首先,我们需要准备一个vector<int> link[maxn],l ...

  3. 拓扑排序(Kahn算法和基于DFS求解法)

    拓扑排序是对有向无环图(DAG)进行排序,从而找到一个序列.该序列满足对于任意一对不同的顶点u,v∈V,若G中存在一条从u->v的边,则在此序列中u在v前面. 拓扑排序也可以用来判断一个有向图是 ...

  4. 拓扑排序——Kahn算法

    Kahn算法 #include <iostream> #include<vector> #include<list> using namespace std;// ...

  5. DAG拓扑排序-Kahn算法

    拓扑排序就是对一个有向无环图进行排序,使其变成一个线性关系,并且保证其前后的位置关系不改,简言之,就是把一个偏序变成一个全序(线性序). 拓扑排序有两种算法,一种是借助DFS排序,另一种是卡恩算法,这 ...

  6. 拓扑排序Kahn算法

    拓扑排序 介绍 思路 操作过程 完美图解 代码模板 介绍 拓扑排序,整体是给出n个事件先后关系,来确定n个事件最终的先后关系 思路 很好理解 操作过程 我们可以理解成一个有向图如果x事件在y事件的前面 ...

  7. Poj 1094 拓扑排序Kahn

    Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...

  8. 通过深度优先算法进行拓扑排序(算法导论)

    通过深度优先算法进行拓扑排序(Java) package graph; //拓扑排序用深度优先算法实现 import java.io.IOException; import java.util.Sca ...

  9. 14.2 拓扑排序DFS算法

    文章目录 原理 Python代码 测试数据 原理   三色标记DFS天然适合拓扑排序.因为三色标记DFS是先查看栈顶元素,如果不是黑色,说明子元素(邻居)还没压栈.这个时候再将子元素压入栈,后续出栈的 ...

最新文章

  1. ESXi上的固态硬盘识别为非SSD
  2. [原]CUDA中grid、block、thread、warp与SM、SP的关系
  3. linux系统定时任务crond入门
  4. Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树
  5. 怎么把html转换成jpg6,html转为图片(六):xhtmlrenderer
  6. django-模板文件加载顺序
  7. Eclipse配置国内镜像源
  8. Java NIO学习篇之NIO的基本认识
  9. java 强制类型转换_lt;08gt;数据类型转换
  10. (二)使用预定义模型 QStringListModel例子
  11. CMD/DOS下符号的作用参考
  12. 计算机组成原理中EMAR是什么,计算机组成原理复习资料+试题
  13. 计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
  14. 人脸方向学习(二十一):Face Landmark Detection-FAB-解读
  15. linux 安装apache resin,Linux下安装resin+apache+jdk+php+mysql(gd)全过程(二)
  16. TCP ACK的pingpong交互模式
  17. linux怎么卸载home文件系统,Linux系统无法卸载文件系统该怎么办
  18. 路由器下一跳地址怎么判断_路由器工作原理(一)
  19. 我的团长我的团分集剧情介绍
  20. 阿里腾讯暑期实习面试被刷的经历

热门文章

  1. 织梦安装或迁移后无法更新栏目HTML,报错无法完成请求
  2. matlab 吸波材料,如何计算多层吸波材料的反射率 - 材料 - 小木虫 - 学术 科研 互动社区...
  3. 如何删除word的分节、分页?
  4. daphile的dsd设置_玩Daphile Digital Mus(2)
  5. 人类史上最大最好的希望事件 字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛
  6. ubuntu 下安装thinkpad硬盘保护APS、电池阀控制详解
  7. 计算机视觉与机器视觉的区别在哪里
  8. 2022-2028全球连续氧化铝纤维行业调研及趋势分析报告
  9. 格式化数据#7:开放课/公开课
  10. 目前有哪些大公司在应用Go语言?