有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<stdio.h>
#include<cmath>
#include<string.h>
#include<iostream>
using namespace std; int a[][];
int rudu[];
int ans[]; int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
memset(a,,sizeof(a));
memset(rudu,,sizeof(rudu));
memset(ans,,sizeof(ans));
int aa,bb;
for(int i=; i<m; i++)
{
scanf("%d %d",&aa,&bb);
//a[aa]=bb;
a[aa][bb]++;
rudu[bb]++;
// dis[bb]=1;
} int p=;
for(int i=; i<=n; i++)
{
int k;
for(int j=; j<=n; j++)
{
if(rudu[j]==)
{
// printf("%d***\n",j);
rudu[j]--;
ans[p++]=j;
k=j;
break;
}
} for(int j=; j<=n; j++)
{
if(a[k][j])
{
a[k][j]--;
rudu[j]--;
}
}
} // cout<<rudu[4]<<endl;-4 for(int i=;i<p-;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[p-]);
}
return ;
}

wa原因:

如果碰到

1 2

1 2出现两次及多次的时候,按照错误的代码2会被加两次,而实际只需要加一次入度即可。所以相当于标记和未标记两种情况,而不需要多次++

这个是后来周赛结束改的AC了

#include<stdio.h>
#include<cmath>
#include<string.h>
#include<iostream>
using namespace std; int a[][];
int rudu[];
int ans[]; int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
memset(a,,sizeof(a));
memset(rudu,,sizeof(rudu));
memset(ans,,sizeof(ans));
int aa,bb;
for(int i=; i<m; i++)
{
scanf("%d %d",&aa,&bb);
//a[aa]=bb;
// a[aa][bb]++;不对
// rudu[bb]++;不对
// dis[bb]=1;
if(a[aa][bb]==)
{
a[aa][bb]=;
rudu[bb]++;
}
} int p=;
for(int i=; i<=n; i++)
{
int k;
for(int j=; j<=n; j++)
{
if(rudu[j]==)
{
// printf("%d***\n",j);
rudu[j]--;
ans[p++]=j;
k=j;
break;
}
} for(int j=; j<=n; j++)
{
if(a[k][j])
{
a[k][j]=;
// a[k][j]--;
rudu[j]--;
}
}
} // cout<<rudu[4]<<endl;-4 for(int i=;i<p-;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[p-]);
}
return ;
}

正好整理一下拓扑排序入门的知识点:

拓扑排序的优点及适用场景:

快速排序是不稳定的,这是因为最后的快排结果中相同元素的出现顺序和排序前不一致了。如果用偏序的概念可以这样解释这一现象:相同值的元素之间的关系是无法确定的。因此它们在最终的结果中的出现顺序可以是任意的。

而对于诸如插入排序这种稳定性排序,它们对于值相同的元素,还有一个潜在的比较方式,即比较它们的出现顺序,出现靠前的元素大于出现后出现的元素。因此通过这一潜在的比较,将偏序关系转换为了全序关系,从而保证了结果的唯一性。而拓扑排序就是一种将偏序转换为全序的一种算法。

补充两个概念,偏序和全序:

偏序:有向图中两个顶点之间不存在环路,至于连通与否,是无所谓的。

全序:就是在偏序的基础之上,有向无环图中的任意一对顶点还需要有明确的关系(反映在图中,就是单向连通的关系,注意不能双向连通,那就成环了)。

意思就是讲,一个不确定的偏序关系经全序后就有一种确定的先后顺序了。

既然有先后,那么在实际生活中的选课问题,比如大一时一定要修完这门课,大二才学第二门课,这种排课问题就是拓扑排序问题。

总结以上,拓扑排序实质上就是一种偏序到全序的排序算法。

定义:
只有有向无环图(Directed Acyclic Graph,简称DAG )才有拓扑排序。 
DAG必至少有一个入度为零的点和一个出度为零的点。

wikipedia中关于拓扑排序的定义:在拓扑排序中,对于任意一个有向边的起点和终点,在排序后起点总是在终点前。

在DAG中如果对于任意两点都可以找到一条路径使二者连通,则称该图是全序的,否则为偏序。 
全序DAG的拓扑排序是该图的一条哈密顿路径,即经过该图的所有顶点。

算法:
常用的有Kahn算法和DFS算法。

附上我入门拓扑排序看的文章:

https://blog.csdn.net/qq_41713256/article/details/80805338

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. HDU 1285 确定比赛名次 拓扑排序模板题

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 #include <cstdio> #include <cstdlib> #inc ...

  5. HDU.1285 确定比赛名次 (拓扑排序 TopSort)

    HDU.1285 确定比赛名次 (拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 只不过这道的额外要求是,输出字典序最小的那组解.那么解决方案就是 ...

  6. ACM: HDU 1285 确定比赛名次 - 拓扑排序

     HDU 1285 确定比赛名次 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  7. hdu 1285 确定比赛名次 拓扑排序

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

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

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

  9. HDU1285 确定名次 拓扑排序

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

随机推荐

  1. bzoj1098题解

    [题意分析] 给你一张无向图,求其补图的联通块数及各个联通块大小. [解题思路] 暴搜! 然而n2会T怎么办? 仔细观察发现m远小于n2,也就是说这是一张极其稠密的补图. 这时就要用到黑科技了:flo ...

  2. Minimum Snap轨迹规划详解(1)轨迹规划

    一. 轨迹规划是什么? 在机器人导航过程中,如何控制机器人从A点移动到B点,通常称之为运动规划.运动规划一般又分为两步: 1.路径规划:在地图(栅格地图.四\八叉树.RRT地图等)中搜索一条从A点到B ...

  3. hive的调优

    调优 1 Fetch抓取(Hive可以避免进行MapReduce) Hive中对某些情况的查询可以不必使用MapReduce计算.例如:SELECT * FROM employees;在这种情况下,H ...

  4. (转)OpenFire源码学习之五:用户登录

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413377 登陆 登陆认证,客户端发送认SASL证消息: <auth mecha ...

  5. Machine Learning 之一,什么是机器学习。

    Machine Learning 机器学习,什么是机器学习.我觉得尚学堂的培训老师讲的很不错,就是两个字来介绍.------拟人. 就是模拟人类的思维方式. 老师举的例子: 和女朋友约会,第一次约会, ...

  6. WinDbg中Check for invalid symbols or bad syntax(断点设置)解决办法

    基础知识 bp 程序运行过程中下断点 bu 程序未加载之前下断点 bl  列出所有断点 bc  清除断点 今天在调试驱动的时候 发现下好断点后 无法调试 WinDbg显示 kd> g Break ...

  7. Centos7.4安装elasticsearch6.3+kibana6.3集群

    Centos7.4安装elasticsearch+kibana集群 Centos7.4安装elasticsearch+kibana集群 主机环境 软件环境 主机规划 主机安装前准备 安装jdk1.8 ...

  8. python_way day15 HTML-DAY2、 回顾HTML-CSS 标签(css强制生效),JS(数据类型,时间处理,作用域)

    python_way day15 HTML-DAY2 html-css回顾 javascript 一.html-css回顾 增加默认值: . 强制生效,就算在上面,被覆盖上了也会生效 解决缩小页面混乱 ...

  9. jsp2自定义标签开篇

    在JSP2中开发标签库需要以下几个步骤: 1.开发自定义标签处理类: 2.建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库可包含多个标签: 3.在JSP文件中使用自定义标签. 第一 ...

  10. Comet OJ - Contest #4 B题 奇偶性

    题目链接:https://www.cometoj.com/contest/39/problem/B?problem_id=1577 题意:给你一个数列,求L 到 R 区间内 所有数列 (ƒn mod ...