传送门

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

这里默认为大家都已经了解了拓扑排序的思想和基本算法, 矩阵法(时间复杂度高,O(N2))以及队列优化法(时间复杂度O(N * M)),

在这里在给出一种写法, 我觉得比较实用, 效率也比较高。

优先队列+链式前向星。

用优先队列的原因是因为拓扑排序出来的结果是不唯一的, 假如题目要求要从小到大或者从大到小都可以直接控制。
 
HDU上用C++会CE错误, 要用G ++提交。

#include<stdio.h>
#include<queue>
#include<string.h>
#include<vector>
using namespace std; int cnt, head[501], n;
int in[501];
priority_queue<int, vector<int>, greater<int> >Q; struct Edge
{
int to, next;
}edge[250 * 500]; void add(int u, int v)
{
edge[++ cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt;
} void topo_sort()
{
int sum = 0;
int ans[501];
for(int i = 1; i <= n; i ++) //入度为0的点入队
if(!in[i])
Q.push(i);
while(!Q.empty())
{
int temp = Q.top();//找到一个入度为0的点temp
ans[++ sum] = temp;//存答案
Q.pop();
for(int i = head[temp]; i != 0; i = edge[i].next)
{
int to = edge[i].to;
in[to] --;//与temp为弧尾的点的入度 - 1,相当于在图中将temp点删除
if(!in[to])//若temp为弧尾的点的入度变为0,那么入队
{
Q.push(to);
}
}
}
printf("%d", ans[1]);//按照格式输出
for(int i = 2; i <= sum; i ++)
{
printf(" %d", ans[i]);
}
printf("\n");
} int main()
{
int m, a, b;
while(scanf("%d%d", &n, &m)!=EOF)
{
cnt = 0;
while(!Q.empty())
Q.pop();
memset(head, 0, sizeof(head));
memset(in, 0, sizeof(in));
for(int i = 1; i <= m; i ++)
{
scanf("%d%d", &a, &b);
add(a, b);
in[b] ++; //存每个点的入度
}
topo_sort();
}
return 0;
}

  

       
 

2019/4/22 拓扑排序的高效写法. 模板题HDU1285:确定比赛名次的更多相关文章

  1. hdu1285 确定比赛名次(拓扑排序)

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

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

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

  3. hdu1285 确定比赛名次(拓扑排序多种方法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 Problem Description 有N个比赛队(1<=N<=500),编号依次 ...

  4. zoj 3524(拓扑排序+多重背包)(好题)

    http://blog.csdn.net/woshi250hua/article/details/7824773 题目大意:从前有n座山,山里都有一座庙,庙里都有一个老和尚,老和尚专送纪念品,每个纪念 ...

  5. Toposort(拓扑排序)dfs递归模板

    最近刷了几题拓扑排序的题,记录一下拓扑排序 在有向图中,并且按照一定的规则(题目所给的规则)排序.如果图中出现了有向环的话就无法排序了. int gap[maxn][maxn];//记录下有向边 in ...

  6. ZOJ-3524 拓扑排序+完全背包(好题)

    题意:在一个DAG上,主角初始有W钱起点在s点,每个点有一个代价wi和价值vi,主角从起点走到某一点不能回头走,一路上可以买东西(一个点的东西可以买无限次),且体力消耗为身上负重*路径长度.主角可以在 ...

  7. 图论--拓扑排序--HDU-1285确定比赛名次

    Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...

  8. hdu1285 确定比赛名次(拓扑排序)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  9. hdu1285 确定比赛名次【拓扑排序】

    题目链接 确定比赛名次                                         Time Limit: 2000/1000 MS (Java/Others)    Memory ...

随机推荐

  1. Python-Django 视图层

    1 request对象 method:请求方式 GET:get请求的参数(post请求,也可以携带参数) POST:post请求的参数(本质是从bdoy中取出来,放到里面了) COOKIES---&g ...

  2. NOIP2016换教室

    题目 一道毒瘤概率期望DP.点这里 首先 对于每个时间段(就是每节课),我们有申请和不申请两种情况.如果不申请的话,一定在$ c[ i ] \(,否则,可能在\)c[ i ]\(,也可能在\)d[ i ...

  3. RabbitMQ可靠性投递及高可用集群

    可靠性投递: 首先需要明确,效率与可靠性是无法兼得的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响.如果是一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率. 要保证消 ...

  4. Python内置函数之classmetho staticmethod

    当对类的静态属性进行修改时(不需要借助于对象就行类静态属性的修改) class Goods: discount = 0.5 def __init__(self,name,price): self.na ...

  5. WIN10在安装mysql时,出现“The security settings could not be applied to the database because the connection has failed with the following error. Error Nr. 1045

    解决方法:1, 首先卸载MySQL2, 再根据这个目录 C:\ProgramData,将MySQL删除.3, 重新安装MySQL 就好了(电脑不用重启)

  6. C# 默认访问修饰符

    c# 中类,成员,枚举,结构等默认访问修饰符是? 根据MSDN文档有: [MSDN] Classes and structs that are not nested within other clas ...

  7. Jenkins 快速上手指南

    步骤: 在服务器上安装好jenkins. 在浏览器地址栏输入:服务器地址+":8080/jenkins",回车访问jenkins主页. 单击“新建”,创建任务.如下图: 为任务命名 ...

  8. 面试题:常用的http状态码

    3XX 重定向 301 Moved Permanently    永久重定向,表示请求的资源已经永久的搬到了其他位置 302 Found  临时重定向,表示请求的资源临时搬到了其他位置 303 See ...

  9. Pycharm 2018.2.1最新版破解到2099年图解教程

    我破解后的效果图 安装我就不说了 工具解压在随便一个目录(文末有下载百度网盘链接)在 Pycharm安装目录的\bin目录下找到 pycharm.exe.vmoptions 和 pycharm64.e ...

  10. 2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017)

    A. Alien Sunset 暴力枚举答案即可. #include<cstdio> int n,i,mx; struct P{ int h,r,t; bool night(int x){ ...