确定比赛名次

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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

一开始是先用邻接矩阵做  这样做思路比较简单但是数据一大的话就会爆内存  而且比起邻接表也慢了很多
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN     freopen("input.txt","r",stdin);
#define FOUT    freopen("output.txt","w",stdout);
#define INF     0x3f3f3f3f
#define lson    l,m,rt<<1
#define rson    m+1,r,rt<<1|1
typedef long long LL;const int MAXN=1000+5;int Map[MAXN][MAXN],cnt[MAXN];int main()
{//FINint N,M,x,y;while(~scanf("%d%d",&N,&M)){memset(Map,0,sizeof(Map));memset(cnt,0,sizeof(cnt));for(int i=1;i<=M;i++){scanf("%d%d",&x,&y);if(Map[y][x]==0)  cnt[y]++;Map[y][x]=1;}for(int i=1;i<=N;i++){int j;for(j=1;j<=N;j++)   {if(cnt[j]==0)  break;}cnt[j]--;if(i<N)  printf("%d ",j);else printf("%d",j);for(int z=1;z<=N;z++){if(Map[z][j]==1)  cnt[z]--;}}printf("\n");}return 0;
}

  

第二种是优化过的邻接表
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN     freopen("input.txt","r",stdin);
#define FOUT    freopen("output.txt","w",stdout);
#define INF     0x3f3f3f3f
#define lson    l,m,rt<<1
#define rson    m+1,r,rt<<1|1
typedef long long LL;const int MAXN=1e5+5;/*判断一个有向图是否有环
每次删除一个入度为0的点,直到没有入度为0的点为止。
如果这时还有点没被删除,这些没被删除的点至少组成一个环;
反之如果所有点都被删除了,则有向图中一定没有环。*/struct Edge{int v,nxt;
}E[MAXN*2];int Head[MAXN],erear;
int IN[MAXN];          //记录入度
int P[MAXN],sz;        //打印用void edge_init(){erear=0;memset(Head,-1,sizeof(Head));memset(IN,0,sizeof(IN));
}void edge_add(int u,int v){E[erear].v=v;E[erear].nxt=Head[u];Head[u]=erear++;}int main()
{//FINint n,m;while(~scanf("%d%d",&n,&m)){edge_init();         //初始化for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);edge_add(u,v);IN[v]++;          //v的入度+1}sz=0;priority_queue<int,vector<int>,greater<int> >Q;     //这题要用到优先队列for(int i=1;i<=n;i++){if(!IN[i])  Q.push(i);          //把入度为0的加入队列}bool sign=0;      //判断是否有多个结果while(!Q.empty()){if(Q.size()>=2)  sign=1;int u=Q.top();Q.pop();P[sz++]=u;         //把要打印的数加入Pfor(int i=Head[u];~i;i=E[i].nxt){        //普通遍历int v=E[i].v;IN[v]--;                             //删边if(!IN[v])  Q.push(v);               //如果删边后新点入度为0加入队列}}if(sz!=n){             //如果不可能的话printf("invalid\n");return 0;}/*if(sign){printf("multi ans\n");return 0;}*/for(int i=0;i<sz;i++){if(i==0)  printf("%d",P[i]);else  printf(" %d",P[i]);}printf("\n");}return 0;
}

  

转载于:https://www.cnblogs.com/Hyouka/p/5739070.html

HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表相关推荐

  1. [ACM] hdu 1285 确定比赛 (拓扑排序)

    确定比赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. HDU 1285 - 确定比赛名次(拓扑排序)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. [ACM] hdu 1285 确定比赛名次 (拓扑排序)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. HDU-1285 确定比赛名次 拓扑排序

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)           ...

  5. hdu 1285 确定比赛名次

    //拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考 //按照数据结构课本的算法,建立邻接表,用栈实现.初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后 ...

  6. hdoj 1285 确定比赛名次 【拓扑排序】

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. HDU - 128 确定比赛名次(基于有向无环图(GAD)的排序--拓扑排序)

    题目链接:https://vjudge.net/contest/325616#problem/A 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N,进行比赛,比赛结束 ...

  8. HDU 1285--确定比赛名次【拓扑排序 amp;amp; 邻接表实现】

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. 拓扑排序杭电 1285确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

最新文章

  1. 06列表的常用基本操作
  2. 看了这几幅图,感觉自己物理白学了!
  3. mysql empty table_【MySQL】 empty table and delete table.
  4. 《大型数据库技术》MySQL的进阶开发技巧
  5. window下git,TortoiseGit安装,以及和github托管项目
  6. 简单好用的应用加密软件:Cisdem AppCrypt Mac版
  7. Modis数据下载与处理(mrt、wget)
  8. App Store审核规则中文版(App审核被拒原因,苹果开发必备)
  9. FlowJo For Mac(流式细胞分析器工具)
  10. 在Visual Studio中对Epicor10进行二次开发
  11. iKuai软路由模拟环境搭建
  12. Win10鼠标点一下文件夹或文件没有选中的那个蓝色,但还是能正常用,比如双击跟右键,点一下也有详细信息
  13. 兔子c语言程序,可爱的C语言程序。....兔子问题...斐波那契数列
  14. 图像处理冷知识——dpi和ppi
  15. win10打开任务管理器的快捷键
  16. 创建两个文本框,一个按钮。第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符;
  17. 笔记本写代码 屏幕尺寸_为什么笔记本电脑的屏幕尺寸如此奇怪?
  18. 服务器带宽什么意思?服务器带宽多少合适?
  19. 第五届世界人工智能大会 • 腾讯“智变未来”论坛召开
  20. eBPF程序摄像头——力争解决可观测性领域未来最有价值且最有挑战的难题

热门文章

  1. nginx-0.1.0文件分析3:ngx_send.c
  2. CSS有效的编写代码
  3. 将csv文件导入mysql
  4. 为什么电脑不能打字_为什么新电脑不能安装win7系统?
  5. burpsuite 设置https_新手教程:如何使用Burpsuite抓取手机APP的HTTPS数据
  6. 教你如何运用golang 实现数组的随机排序
  7. ASP.NET Razor – C# 循环和数组简介
  8. 必须安利的KubernetesDevOps工具
  9. 单片机初学者做项目为什么这么难?单片机初学者心得有哪些
  10. 3加2大专计算机专业考什么,3加2学校有什么专业 初中生怎么报考3+2