巡回赛

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
世界拳击协会(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 巡回赛 拓扑排序相关推荐

  1. nyoj496巡回赛-拓扑排序-拓扑序列

    巡回赛 时间限制:1000 ms | 难度:3 描述 N 名拳击手进行了 M 场比赛,每场赛均可分出胜负,赛后对 N 名选手进行排序,对于每名拳手,必须满足该拳手所战胜过的对手全部排在其后才能对该排名 ...

  2. 拓扑排序[TopologicalSort]

    闲来无事,看到了拓扑排序就学习了一下. 拓扑排序: 算导上说是使用深搜来对有向无环图进行排序,得到一种线性次序.不过深搜的理解还理解不到.估计是深搜学的不怎么样吧! 说说我理解的这个线性次序吧.我认为 ...

  3. 【图论】有向无环图的拓扑排序

    1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...

  4. C#实现有向无环图(DAG)拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...

  5. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  6. usaco frame up(所有拓扑排序的输出)

    先根据图建图再拓扑排序. /** ID: jinbo wu TASK: frameup LANG:C++ */ #include<bits/stdc++.h> using namespac ...

  7. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  8. C/C++二级指针概念及应用(有向图的邻接表(拓扑排序)、有向网图的邻接表、树的孩子表示)

    目录 一.概述 例1: 例2: 代码: 二.实例 1.有向图的邻接表(拓扑排序) 2.有向网图的邻接表 3.树的孩子表示 一.概述 二级指针:指向指针的指针.一般需要修改地址的时候会用到二级指针. 注 ...

  9. 极小连通子图和极大连通子图_强连通分量与拓扑排序

    前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...

最新文章

  1. 下怎么运行sh脚本_基于CentOS7系统添加自定义脚本服务及参数说明,附实例
  2. 百万人学AI:CSDN重磅共建人工智能技术新生态
  3. Python 列表(数组)初识
  4. 视频会议进入云时代,所有企业的必答题
  5. 未来数据领域的珠穆朗玛峰之中文自然语言处理
  6. 利用OpenCvSharp处理图片并在winformd的pictureBox中显示
  7. 某道Pwn(格式化字符串漏洞)
  8. 通过管理门户部署云服务与VIP交换
  9. 服务器响应头隐藏X-power-by
  10. ppc手机用蓝牙和电脑同步上网设置教程
  11. 直通输出设备 android kodi,PVE直通核显搭建LibreELEC KODI HTPC实现HDMI输出
  12. 小米手机只能进fastboot怎么办?
  13. mysql创建视图并加注释_在mysql中为视图创建注释
  14. 学习笔记 Tianmao 篇 recyclerView 辅助的RecycleAdapterImpl类(适配Sliderview)
  15. 冬日魔幻之旅-seata+dubbo+nacos+springboot解决分布式事务的全网段唯一实践之作(上)
  16. numpy 归一化 与 标准化
  17. Java程序界面设计
  18. ajax 获取数据并展示到前台
  19. Revit-调用系统命令-PostCommand
  20. 动态规划之六:数位dp(未完)

热门文章

  1. 如何在dva的effects中实现回调
  2. 准备:新V8即将到来,Node.js的性能正在改变
  3. 哈,又一款超级简单的队列(MQ)实现方案来了~
  4. UVa 11388 - GCD LCM
  5. 把虚拟系统接入网络 虚拟系统工作模式
  6. breakout room at teams
  7. tip for interview
  8. corpora for america English
  9. Patent Writing and cultivation of innovation thinking
  10. NOJ37 回文字符串---整理一下都是各种回文类型啊,