NYOJ 496 巡回赛 拓扑排序
巡回赛
- 描述
-
世界拳击协会(WBA)是历史最悠久的世界性拳击组织,孕育了众多的世界冠军,尤其是重量级,几乎造就了大家耳熟能详的所有伟大的拳王。阿里、弗雷泽、福尔曼被称为“70年代重量级拳坛 三巨头”,是当之无愧的拳王,他们的得到的金腰带都刻有 WBA 字样。为庆贺世界拳击协会成立 50 周年,WBA 主席门多萨邀请 N 名拳击手进行了 M 场巡回比赛,每场比赛均可分出胜负,比赛过后组委会要对 N 名选手进行排序,对于每名拳手,必须满足该拳手所战胜过的对手全部排在其后才能对该排名满意。
现给出 M 场比赛的胜负关系,请你帮组委会决定是否能够唯一确定这样的排名,使得所有的拳击手都满意,若能唯一确定则输出最终排名。- 输入
-
第一行给出测试数据的组数 T(0<T<30),对于每组测试数据,首先依次给出N(1<=N<=26),M(0<=M<=1000)分别表示拳手数和比赛数,拳手的姓名依次为从 A开始的前 N 个大写字母,接下 M 行给出每场比赛的比赛结果,每行由两个大写字母组成,两者之间有一空格。
如 “A B”则表示在某场比赛中 A 战胜了 B。 - 输出
- 对于每组测试,若不存在唯一的排名序列则单行输出“No Answer”,若存在则按排名从高至低输出拳手的名字。
- 样例输入
-
3 4 4 A B A C B C C D 4 4 A B A C B D C D 3 3 A B B A A C
- 样例输出
-
ABCD No Answer No Answer
解题思路:先找到一个入度为0的点,从这个点开始找下一个入度为0的点,直到把所有的点都找完;在找的过程中,如果同时有多个或0个入度为0的点(最后一个点除外),则不存在拓扑排序。
#include<stdio.h> #include<string.h> int map[30][30],b[50],n,m,in[50]; char c[100]; void toposort() {int incnt=0,flag=1,front=1,rear=1,i,j,k;for(i=1;i<=n;i++)if(!in[i]){incnt++;b[rear++]=i; /*找第一个入度为0的点*/}if(incnt!=1)flag=0;j=0; /*记录保存的点的个数*/while(front<rear){incnt=0;k=b[front++];c[j++]=k+'A'-1; /*保存排好序的点*/for(i=1;i<=n;i++) /*注意是n个点,不要写成m*/{if(map[k][i]){in[i]--;if(!in[i]) {incnt++;b[rear++]=i;/*如果入度为0,加入队尾*/}} }if(incnt>1) /*如果入度为0的点大于1个,不存在拓扑排序。特别注意此处,不能写成incnt!=1,因为从最后一个点找,入度为0的点肯定是0,flag会变成0*/{flag=0;break;}}if(j<n||!flag)printf("No Answer\n");else{for(i=0;i<j;i++)printf("%c",c[i]);printf("\n");} } int main() {int t,i;scanf("%d",&t);while(t--){char A,B;int a,b;memset(map,0,sizeof(map));memset(in,0,sizeof(in));memset(c,0,sizeof(c));scanf("%d%d",&n,&m);getchar();for(i=1;i<=m;i++){scanf("%c %c",&A,&B);a=A-'A'+1;b=B-'A'+1;map[a][b]=1;in[b]++;getchar();}toposort();}return 0; }
NYOJ 496 巡回赛 拓扑排序相关推荐
- nyoj496巡回赛-拓扑排序-拓扑序列
巡回赛 时间限制:1000 ms | 难度:3 描述 N 名拳击手进行了 M 场比赛,每场赛均可分出胜负,赛后对 N 名选手进行排序,对于每名拳手,必须满足该拳手所战胜过的对手全部排在其后才能对该排名 ...
- 拓扑排序[TopologicalSort]
闲来无事,看到了拓扑排序就学习了一下. 拓扑排序: 算导上说是使用深搜来对有向无环图进行排序,得到一种线性次序.不过深搜的理解还理解不到.估计是深搜学的不怎么样吧! 说说我理解的这个线性次序吧.我认为 ...
- 【图论】有向无环图的拓扑排序
1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...
- C#实现有向无环图(DAG)拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...
- hdu 5438 Ponds 拓扑排序
Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...
- usaco frame up(所有拓扑排序的输出)
先根据图建图再拓扑排序. /** ID: jinbo wu TASK: frameup LANG:C++ */ #include<bits/stdc++.h> using namespac ...
- HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集
题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...
- C/C++二级指针概念及应用(有向图的邻接表(拓扑排序)、有向网图的邻接表、树的孩子表示)
目录 一.概述 例1: 例2: 代码: 二.实例 1.有向图的邻接表(拓扑排序) 2.有向网图的邻接表 3.树的孩子表示 一.概述 二级指针:指向指针的指针.一般需要修改地址的时候会用到二级指针. 注 ...
- 极小连通子图和极大连通子图_强连通分量与拓扑排序
前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...
最新文章
- 下怎么运行sh脚本_基于CentOS7系统添加自定义脚本服务及参数说明,附实例
- 百万人学AI:CSDN重磅共建人工智能技术新生态
- Python 列表(数组)初识
- 视频会议进入云时代,所有企业的必答题
- 未来数据领域的珠穆朗玛峰之中文自然语言处理
- 利用OpenCvSharp处理图片并在winformd的pictureBox中显示
- 某道Pwn(格式化字符串漏洞)
- 通过管理门户部署云服务与VIP交换
- 服务器响应头隐藏X-power-by
- ppc手机用蓝牙和电脑同步上网设置教程
- 直通输出设备 android kodi,PVE直通核显搭建LibreELEC KODI HTPC实现HDMI输出
- 小米手机只能进fastboot怎么办?
- mysql创建视图并加注释_在mysql中为视图创建注释
- 学习笔记 Tianmao 篇 recyclerView 辅助的RecycleAdapterImpl类(适配Sliderview)
- 冬日魔幻之旅-seata+dubbo+nacos+springboot解决分布式事务的全网段唯一实践之作(上)
- numpy 归一化 与 标准化
- Java程序界面设计
- ajax 获取数据并展示到前台
- Revit-调用系统命令-PostCommand
- 动态规划之六:数位dp(未完)