HDU 1285 确定比赛名次(拓扑排序模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285
题目大意:有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
解题思路:拓扑排序裸题,但是有要求并列的点序号小的排在前面。开始写了一个dfs版倒序的怎么写都错,后来发现根本做不了(可能是我太菜了)。。。。于是改写了一个通过每次查找入读为0的点,然后删除有关边的版本,一下就AC了。
先是对了的方法,先叫它减入度法吧,这种做法可以判断有向图是否成单链,也就是没有分支,若一次找到入度为0的点有两个则存在分支。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=5e2+; int n,m;
int degree[N];
bool G[N][N];
queue<int>q; void toposort(){
for(int i=;i<=n;i++){
//寻找入度为0的点
int j=;
while(degree[j]!=) j++;
degree[j]--;
q.push(j);
//将关联的点的入度减1,即删除与该节点关联的边
for(int k=;k<=n;k++){
if(G[j][k])
degree[k]--;
}
}
} int main(){
while(~scanf("%d%d",&n,&m)){
memset(G,false,sizeof(G));
memset(degree,,sizeof(degree));
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
if(!G[a][b]){
G[a][b]=true;
degree[b]++;
}
}
toposort();
while(!q.empty()){
if(q.size()==)
printf("%d\n",q.front());
else
printf("%d ",q.front());
q.pop();
}
}
return ;
}
然后是dfs版的,虽然不能写这题,但还是当个模板放着吧,dfs法可以在O(n^2)时间内判断是否有环,而floyd需要O(n^3)。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
const int N=5e2+; int n,m;
int G[N][N],vis[N];//vis[i]=0,-1,1分别表示未访问、正在访问、已访问并且已递归访问完所有子孙
stack<int>res; bool dfs(int u){
vis[u]=-;
for(int i=;i<=n;i++){
if(G[u][i]){
if(vis[i]<) return false;
else if(!vis[i]&&!dfs(i))
return false;
}
}
vis[u]=;
res.push(u);
return true;
} bool toposort(){
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){
if(!vis[i]){
if(!dfs(i)) return false;
}
}
return true;
} int main(){
while(~scanf("%d%d",&n,&m)){
memset(G,,sizeof(G));
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
G[a][b]=;
}
toposort();
while(!res.empty()){
if(res.size()==)
printf("%d\n",res.top());
else
printf("%d ",res.top());
res.pop();
}
}
return ;
}
HDU 1285 确定比赛名次(拓扑排序模板)的更多相关文章
- HDU 1285 确定比赛名次 拓扑排序模板题
http://acm.hdu.edu.cn/showproblem.php?pid=1285 #include <cstdio> #include <cstdlib> #inc ...
- HDU.1285 确定比赛名次 (拓扑排序 TopSort)
HDU.1285 确定比赛名次 (拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 只不过这道的额外要求是,输出字典序最小的那组解.那么解决方案就是 ...
- ACM: HDU 1285 确定比赛名次 - 拓扑排序
HDU 1285 确定比赛名次 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u De ...
- hdu 1285 确定比赛名次 拓扑排序
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛 ...
- hdu 1285 确定比赛名次 (拓扑)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDOJ 1285 确定比赛名次(拓扑排序)
Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...
- [ACM] hdu 1285 确定比赛 (拓扑排序)
确定比赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)
确定比赛名次 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- [ACM] hdu 1285 确定比赛名次 (拓扑排序)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
随机推荐
- [LeetCode] 31. Next Permutation ☆☆☆
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 1.Spring揭秘--Ioc容器
1.Ioc即控制反转,假设一个类需要依赖另外一个类,在最初始的做法就是创建那个依赖类的对象,然后使用这个类提供的功能,如果创建这个依赖类的职责交给Ioc Service Provider去做,那么这就 ...
- 算法专题-STL篇
这篇文章着重记录c++中STL的用法.主要粗略的介绍其用法,以知识点的形式呈现其功能,不会深入源码分析其工作原理. 排序和检索. sort(a,a+n),对a[0]往后的n个元素(包括a[0])进行排 ...
- Atcoder #017 agc017 A.Biscuits 简单数学
LINK 题意:水题 求取数,使得和为奇数或偶数的方案数. 思路:统计奇数和偶数,组合求一下发现结果就是$2^{odd-1} + 2^{eve-1}$ 注意特殊情况,即奇数个为0又要求和为奇数的方案数 ...
- ⑤ 设计模式的艺术-05.原型(Prototype)模式
场景 思考一下:克隆技术是怎么样的过程? 克隆羊多利大家还记得吗? javascript语言中的,继承怎么实现?那里面也有prototype,大家还记得吗? 原型模式 通过new产生一个对象需要非常繁 ...
- .NET面试题系列(二)GC
序言 对象生存期 Phone item=new Phone() 在C#中,创建对象使用的是new关键字. 要注意的是new操作返回的并不是对象本身,而是对象的一个引用(Reference). 如果使用 ...
- asp.net后台代码动态添加JS文件和css文件的引用
首先添加命名空间 using System.Web.UI.HtmlControls; 代码动态添加css文件的引用 HtmlGenericControl myCss = new HtmlGeneric ...
- PHP脚本运行时间
http://www.cnblogs.com/zqifa/p/php-16.html PHP设置脚本最大执行时间的三种方法 php.ini 中缺省的最长执行时间是 30 秒,这是由 php.ini 中 ...
- NYOJ 1063 生活的烦恼 (二叉树)
题目链接 描述 生活的暑假刚集训开始,他要决心学好字典树,二叉树,线段树和各种树,但生活在OJ上刷题的时候就遇到了一个特别烦恼的问题.那当然就是他最喜欢的二二叉树咯!题目是这样的:给你一颗非空的二叉树 ...
- NYOJ 221 Tree (二叉树)
题目链接 描述 Little Valentine liked playing with binary trees very much. Her favorite game was constructi ...