HDU 5961 传递 题解
题目
我们称一个有向图G是 传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。
我们称图G是一个 竞赛图,当且仅当它是一个有向图且它的基图是完全图。换句 话说,将完全图每条边定向将得到一个竞赛图。
下图展示的是一个有4个顶点的竞赛图。

现在,给你两个有向图\(P=(V,E_p)\)和\(Q = (V,E_e)\),满足:
- \(E_P\)与E_$e没有公共边;
- \((V,E_p \cup E+e)\)是一个竞赛图。
你的任务是:判定是否\(P,Q\)同时为传递的。
输入格式
包含至多20组测试数据。
第一行有一个正整数,表示数据的组数。
对于每组数据,第一行有一个正整数n。接下来n行,每行为连续的n个字符,每 个字符只可能是’-’,’P’,’Q’中的一种。
- 如果第i行的第j个字符为’P’,表示有向图P中有一条边从i到j;
- 如果第i行的第j个字符为’Q’,表示有向图Q中有一条边从i到j;
- 否则表示两个图中均没有边从i到j。
保证\(1 <= n <= 2016\),一个测试点中的多组数据中的n的和不超过16000。保证输入的图一定满足给出的限制条件。
输出格式
对每个数据,你需要输出一行。如果P! Q都是传递的,那么请输出’T’。否则, 请输出’N’ (均不包括引号)。
输入样例
4
4
-PPP
--PQ
---Q
----
4
-P-P
--PQ
P--Q
----
4
-PPP
--QQ
----
--Q-
4
-PPP
--PQ
----
--Q-
输出样例
T
N
T
N
题解
样例图

注:在样例2中,P不是传递的。在样例4中,Q不是传递的。
假设\(1->2,2->3\)有边, 但\(1->3\)无边, 就不是传递的, 那么什么情况下\(1->3\)无边呢, 一种情况是\(3->1\)有边, 另一种情况是另一个图在\(1,3\)之间有边
第一种情况, \(1->2,2->3,3->1\), 这显然是一个环
第二种情况, 当另一张图有\(3->1\), 拼起来就构成一个环;当另一张图有\(1->3\), 每条边反向拼起来也是一个环
所以使用拓扑排序找环即可。
代码
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
std::vector<int> edge[2017];
std::queue<int> Q;
int m, n, in[2017], cnt, newn;
int main() {
scanf("%d", &n);
while (n--) {
scanf("%d", &m);
memset(in, 0, sizeof(in));
for (int i = 1; i <= m; i++) edge[i].clear();
while (!Q.empty()) Q.pop();
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= m; ++j) {
char ch;
scanf(" %c", &ch);
if (ch == 'P') in[j]++, edge[i].push_back(j);
else if (ch == 'Q') in[i]++, edge[j].push_back(i);
}
for (int i = 1; i <= m; i++) if (!in[i]) Q.push(i);
cnt = 0;
while (!Q.empty()) {
newn = Q.front(), Q.pop(), cnt++;
for (int i = 0; i < edge[newn].size(); i++) {
in[edge[newn][i]]--;
if (in[edge[newn][i]] == 0) Q.push(edge[newn][i]);
}
}
puts((cnt == m)?"T":"N");
}
}
HDU 5961 传递 题解的更多相关文章
- HDU 5961 传递 随机化
传递 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5961 Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若 ...
- HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem ...
- HDU 5961 传递
http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意: 思路: 话不多说,直接暴力. #include<iostream> #include& ...
- 【HDU 5961 传递】
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission ...
- HDU - 5961 传递 想法,bfs
题意:给你一个有向图,满足去掉方向是完全图,将其拆成PQ两个图(没有公共边),问你两图是否分别满足对于任意3个点a,b,c 若有一条边从a到b且有一条边从b到c ,则同样有一条边从a到c. 题解:观察 ...
- HDU 5961 传递 BFS
题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...
- hdu 5961 传递 (2016ccpc 合肥站 A题)
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- hdu 5961 传递(暴力搜索)
我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全 ...
- 【图论】HDU 5961 传递
题目内容 题目链接 我们称一个有向图G是传递的当且仅当对任意三个不同的顶点a,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个竞赛图,当且仅当它是一个有向图 ...
随机推荐
- 11.经典O(n²)比较型排序算法
关注公号「码哥字节」修炼技术内功心法,完整代码可跳转 GitHub:https://github.com/UniqueDong/algorithms.git 摘要:排序算法提多了,很多甚至连名字你都没 ...
- CMAKE工具学习
最近在学习各大物联网平台的SDK包,发现其工程都使用了一种叫cmake的工具在管理代码.于是花了一天时间简单学习了解了cmake工具,其目的是让自己能读懂使用该工具管理的代码,并能简单使用该工具管理我 ...
- LiveCharts 提示框(DataTooltip)百分比一直为0.00%解决办法
LiveCharts 提示框(DataTooltip)百分比一直为0.00%解决办法 问题描述:在使用LiveCharts 开源图标库的时候,使用CartesianChart类图表,当Series为L ...
- 如何将H5一键部署到托管服务中
随着各个大型App都推出了自己的小游戏平台,游戏也越来越受到开发者的关注.Cocos Creator是一个完整的游戏开发解决方案,包含了轻量高效的跨平台游戏引擎,以及能让你更快速开发游戏所需要的各种图 ...
- 包子凑数(dp 0-1、完全背包)【背包问题】
包子凑数(蓝桥杯) 感谢:@ Statusrank 题目链接(点击) 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多 ...
- CDN百科第四讲 | 如何优雅地在云上“摆摊”——做直播带货,你不得不关注的技术
最近,国家政策开始鼓励“地摊经济”,一时间各家企业平台纷纷推出地摊扶持政策,地摊概念股顺势大涨,地摊生态及配套商品也开始走俏,甚至在网络上也涌现出各种“新摊主速成攻略”,万亿的烟火经济俨然已经走上风口 ...
- Flume-1.4.0和Hbase-0.96.0整合
在使用Flume的时候,请确保你电脑里面已经搭建好Hadoop.Hbase.Zookeeper以及Flume.本文将以最新版的Hadoop-2.2.0.Hbase-0.96.0.Zookeeper-3 ...
- usb串口的作用以及JLINK
usb串口的作用 (1)可以当串口使用 (2)如果usb串口连接到STM32的串口1(stm32ISP下载只能是串口1),可以用串口下载程序 (3)因为要连接到usb,可以用来供电 JLINK JLI ...
- 深度解密 Go 语言之 sync.map
工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garb ...
- Python中和迭代有关的两个函数next()和iter()
next(): next()返回迭代器的下一个项目 next语法: next(iterator[,dafault]) iterator -- 可迭代对象 default -- 可选,用于设置在没有下一 ...