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
随机推荐
- pycaffe︱caffe中fine-tuning模型三重天(函数详解、框架简述)
本文主要参考caffe官方文档[<Fine-tuning a Pretrained Network for Style Recognition>](http://nbviewer.jupy ...
- OpenGL直线点画模式
程序来自<OpenGL编程指南第七版> #include "stdafx.h" #include <Windows.h>//头文件一定要加上,因为windo ...
- Rweibo , wordcloud
利用Rweibo ,wordcloud做词云 #导入需要的包,不存在则下载 require(Rweibo) #必须先调用rJava不然Rwordseg 无法使用 library(rJava) requ ...
- USB设备驱动概述
USB设备驱动 · )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...
- Android的sdk、api及工程目录说明
SDK下包的说明1:add-ons:Android开发需要的第三方文件和软件库2:docs:Android的文档.包括开发指南.API参考.资源等3:extras:扩展的附加包4:platforms: ...
- 获取对固定列不重复的新DataTable
获取对固定列不重复的新DataTable ///<summary> /// 获取对固定列不重复的新DataTable /// </summary> ///<param ...
- filter()和find()的区别
<div class="css"> <p class="rain">测试1</p> </div> <div ...
- 最新的 iOS 申请证书与发布流程
申请流程. 1. 申请钥匙串文件 进入 (Launchpad),找到 (我的是在其他里面找到的),运行后再左上角 存储在桌面就好了,然后就完成退出钥匙串工具就可以了. 2.申请开发证书,发布证书 ...
- JAVA IDE IntelliJ IDEA 快捷键使用详记
一.高效定位代码 1.项目之间的跳转 Ctrl + Alt + [ :切换到下一个项目窗口 Ctrl + Alt + ] : 切换到上一个项目窗口 2.文件之间的跳转↑↓←→ Ctrl + E ...
- 用yeoman搭建react画廊项目笔记
1.安装yeoman npm install yo -g yo --version //检测 yeoman版本,成功显示版本号,则安装成功 2.到yeoman官网 http://yeoman.io ...