UVA 10305 Ordering Tasks(拓扑排序的队列解法)
题目链接:
https://vjudge.net/problem/UVA-10305#author=goodlife2017
题目描述
John有n个任务,但是有些任务需要在做完另外一些任务后才能做。
输入
输入有多组数据,每组数据第一行有两个整数1 <= n <= 100 和 m。n是任务个数(标记为1到n),m两个任务直接关系的数量。在此之后,有m行,每行有2个整数i和j,代表任务i必须在任务j之前完成。用n = m = 0结束整个输入。
输出
每一个数据对应一行n个整数,代表任务完成的顺序。
样例输入
5 4
1 2
2 3
1 3
1 5
0 0
样例输出
1 4 2 5 3
/*
问题 给出变量的个数n和m个二元组,输出任意一个从小到大的排序
解题思路 由题中所给的m个二元组可以得到每个点的入度,创建一个队列,先将入度为0的点加入队列,
然后依次出队,出队过程中将以该点为起点的那条边的终点的入度减去1,如果该点的入度变为0,就将该点也加入队列,
直到队列为空。 如果队列为空后,出队的点的个数等于总个数,则说明有拓扑序列,否则说明图内有环,够不成拓扑序列。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std; const int maxn=; vector<int> g[maxn];//表示以g[i]为起点的边,比如表示1——2和1——3这两条边,g[1]中第一个元素为2,第二个元素为3
int rd[maxn];
int topo[maxn]; bool toposort(int n); int main()
{
int m,n,i,u,v,j,flag;
while(scanf("%d%d",&n,&m), n + m != ){
for(i=;i<=m;i++){
scanf("%d%d",&u,&v);
flag=;
for(j=;j<g[u].size();j++)
if(g[u][j] == v)
{
flag=;
break;
}
if(!flag) g[u].push_back(v);
} if(toposort(n)){
for(i=;i<n-;i++)
printf("%d ",topo[i]);
printf("%d\n",topo[n-]);
} for(i=;i<=n;i++)
g[i].clear();
}
return ;
} bool toposort(int n)
{
int i,j;
memset(rd,,sizeof(rd));
for(i=;i<=n;i++){
for(j=;j<g[i].size();j++){
rd[ g[i][j] ]++;
}
} int t=;
queue<int> q;
for(i=;i<=n;i++)
if(rd[i]==){
q.push(i);
} int x;
while(!q.empty()){
x=q.front();
q.pop();
topo[t++]=x;
for(i=;i<g[x].size();i++){
j=g[x][i];
rd[ j ]--; if(rd[j]==)
q.push(j);
}
} if(t==n) return ;
return ;
}
UVA 10305 Ordering Tasks(拓扑排序的队列解法)的更多相关文章
- UVA.10305 Ordering Tasks (拓扑排序)
UVA.10305 Ordering Tasks 题意分析 详解请移步 算法学习 拓扑排序(TopSort) 拓扑排序的裸题 基本方法是,indegree表示入度表,vector存后继节点.在tops ...
- Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现
今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...
- UVa 10305 - Ordering Tasks (拓扑排序裸题)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- Ordering Tasks UVA - 10305 图的拓扑排序
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- UVA - 10305 Ordering Tasks(拓扑排序)
题意:给定优先关系进行拓扑排序. 分析:将入度为0的点加入优先队列,并将与之相连的点入度减1,若又有度数为0的点,继续加入优先队列,依次类推. #pragma comment(linker, &quo ...
- UVa 10305 Ordering Tasks (例题 6-15)
传送门: https://uva.onlinejudge.org/external/103/10305.pdf 拓扑排序(topological sort)简单题 自己代码的思路来自: ==> ...
- M - Ordering Tasks(拓扑排序)
M - Ordering Tasks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descri ...
- Ordering Tasks 拓扑排序
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- uva 10305 ordering tasks(超级烂题)——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHIAAAHDCAYAAABI5T2bAAAgAElEQVR4nOydPY7svLW1awQGNABHCm
随机推荐
- JVM笔记6-垃圾回收概述
JVM进行垃圾回收时要考虑哪的问题如下: 1.如何判定对象为垃圾对象? 1.引用计数法:在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1,引用失效的时候,计数器的值就-1, ...
- js 滚动到一定位置导航定位在页面最顶部
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 02-python中列表的增删改查
增: append() #添加到原有列表的最后 In [1]: names = ["老王","老李","老刘","老张" ...
- Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
一. DM6446 GPIO的介绍 说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看<LINUX 设备驱动程序>第三 ...
- dm642的中断
void fifoint_isr(); extern far void vectors(); void int_init() { IRQ_resetAll(); IRQ_se ...
- PCI9054 学习小结
PCI的基本协议这里就不介绍了,因为一般的芯片协议都是集成好的,我只需要大体了解就行,不需要做芯片,我感觉就不需要太了解协议. 这里讲解是基于PLX 的9054(9052)芯片为基础的,本人只是入门, ...
- 制作U盘启动CDLinux
用U盘启动CDLinux的好处就此不必多说了,直接上料: 下载必需文件: 1,CDLinuxU盘启动制作工具:CDLinuxU盘启动制作工具 2,CDlinux 0.9.7 集_奶瓶_打气筒_mini ...
- HI3531例子程序说明
Hisilicon Hi35xx 样例程序使用说明 1. 样例程序文件结构说明 sample # MPP 样例程序 |-- common # hi35x ...
- hdu5937 Equation
题解其实网上有 突然有点感想 为什么可以用搜索或状压,因为方案数很有限,它要求每种方案不同就意味着搜索的次数也一定,所以现在就应该坚定往这方面想,找部分方案的贪心.这和上一题一样,都是先暴力,后面处理 ...
- pycharm short-cut
Ctrl + the left mouse button Ctrl + Alt + Left/Right if invalid, system setting