确定比赛名次

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20395    Accepted Submission(s): 8197

Problem Description
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
 
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
 
在数据结构中学了拓扑排序后,再做了一次,本想用栈实现,结果wa哭了,然后发现,题目要求有多种情况时尽量由小到大排出,用栈没有办法实现(可能是可以实现的),用优先队列相当方便。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std; int map[][];
int degree[],ans[];
int n,m; struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
}; /*bool operator<(const int &a,const int &b)
{
if(a<b)
return 1;
return 0;
}*/ void topusort()
{
priority_queue<int,vector<int>,cmp1> s;
while(!s.empty())
s.pop();
int cnt=;
for(int i=n; i>=; i--)
{
if(degree[i]==)
{
s.push(i);
}
}
while(!s.empty())
{
int h=s.top();
s.pop();
degree[h]--;
ans[cnt++]=h;
for(int i=n; i>=; i--)
{
if(map[h][i]==)
{
//map[h][i]=0;
degree[i]--;
if(degree[i]==)
s.push(i);
}
}
}
}
int main()
{ while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,,sizeof(map));
memset(degree,,sizeof(degree));
memset(ans,,sizeof(ans));
for(int i=; i<m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(map[x][y]==)
{
map[x][y]=;
degree[y]+=;
}
}
//cout<<degree[3]<<endl;
topusort();
for(int i=;i<n;i++)
{
if(i==n-)
printf("%d\n",ans[i]);
else
printf("%d ",ans[i]);
}
}
return ;
}

再附上第一次做时模拟的代码:

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int sf[][],zt[];
int main()
{
int n,m,p1,p2;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(sf,,sizeof(sf));
memset(zt,,sizeof(zt));
while(m--)
{
scanf("%d%d",&p1,&p2);
if(!sf[p1][p2])
{
sf[p1][p2]=;
zt[p2]++;
}
}
int i,j,k;
for(i=; i<=n; i++)
for(j=; j<=n; j++)
if(zt[j]==)
{
zt[j]--;
if(i==n)
printf("%d\n",j);
else
printf("%d ",j);
for(k=;k<=n;k++)
if(sf[j][k])
zt[k]--;
break;
}
}
return ;
}

HDU_1285_拓扑排序(优先队列)的更多相关文章

  1. HDU 4857 拓扑排序 优先队列

    n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...

  2. 2016"百度之星" - 初赛(Astar Round2A)HDU 5695 拓扑排序+优先队列

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. HDU-4857-逃生-反向拓扑排序+优先队列

    HDU-4857 题意就是做一个符合条件的排序,用到拓扑序列. 我一开始wa了多发,才发现有几个样例过不了,发现1->2->3...的顺序无法保证. 后来就想用并查集强连,还是wa: 后来 ...

  4. HDU 5638 拓扑排序+优先队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...

  5. POJ 3687 Labeling Balls【拓扑排序 优先队列】

    题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.cs ...

  6. HDU 4857 (反向拓扑排序 + 优先队列)

    题意:有N个人,M个优先级a,b表示a优先于b.而且每一个人有个编号的优先级.输出顺序. 思路来自:与PKU3687一样 在主要的拓扑排序的基础上又添加了一个要求:编号最小的节点要尽量排在前面:在满足 ...

  7. HDU1285 确定比赛问题【拓扑排序+优先队列】

    题目 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩, ...

  8. hdu1285确定比赛名次(拓扑排序+优先队列)

    传送门 第一道拓扑排序题 每次删除入度为0的点,并输出 这题要求队名小的排前面,所以要用到重载的优先队列 #include<bits/stdc++.h> using namespace s ...

  9. hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]

    传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131 ...

随机推荐

  1. Windows 10+Ubuntu 16.04双系统切换后时间不同步的问题解决

    主要时时区不对造成的,少了8个小时,解决方法: 在Ubuntu的终端下输入以下命令: sudo timedatectl set-local-rtc 1 参考: http://blog.csdn.net ...

  2. Cisco路由器配置ADSL上网

    cisco1841#sh run Building configuration... Current configuration : 2970 bytes ! version 12.4 service ...

  3. Cocos2d-HTML5搭载nodejs express3

    源代码 已经上传到github Cocos2d-HTML5 入门第一天搭载了express3 server.Cocos2d-html5配置改了不少路径,改得有点乱. 今天又重搭了一遍server,力求 ...

  4. HDU 5305 Friends(简单DFS)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  5. iOS常用的宏定义总结

    字符串是否为空 1   #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull class]] || str == nil || [str le ...

  6. iOS开发-植入广告(iAd, Admob实例)

    应用中植入广告是一种非常好的盈利手段. 以下介绍主流的两种方法.iAd, Admob 先mark一个非常具体的pdf.   http://pan.baidu.com/share/link?sharei ...

  7. C/C++ 答疑解问

    1. sizeof(string)的大小 string属于类,类的大小就是类中成员变量(非静态)加上指向虚函数表的指针以及指向虚基类表的指针加起来的和.因为string是一个模板类,受具体的实现来决定 ...

  8. linux驱动之设备号与创建设备节点

    设备号: 1.自己主动分配 major = register_chrdev(0,"first_drv",&first_sdv_fops);//注冊 注冊设备时给设备号写0, ...

  9. go语言笔记——包的概念本质上和java是一样的,通过大小写来区分private,fmt的Printf不就是嘛!

    示例 4.1 hello_world.go package main import "fmt" func main() { fmt.Println("hello, wor ...

  10. 【高德地图API】VS2012或者VS2013添加高德地图v2.1.1版本SDK失败

    可能由于v2.1.1版本SDK可能是在Win8.1环境下编译[这里有许多的原因,系统升级,安装VS2013等等] 有童鞋在操作正常的情况下添加SDK失败,提示版本不兼容. 如下图: 编辑项目  *.c ...