【图论】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⋃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\le n\le 2016\),一个测试点中的多组数据中的\(n\)的和不超过16000。保证输入的图一定满足给出的限制条件。
样例
见链接
样例解释
在下面的示意图中,左图为图为Q。
注:在样例2中,P不是传递的。在样例4中,Q不是传递的。
输出格式
对每个数据,你需要输出一行。如果P,Q都是传递的,那么请输出T
。否则, 请输出N
。
思路
若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。
如果bfs搜到了长度超过1的路径,就意味着图不是传递的。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2020;
struct Edge{
int from,to,nxt;
}p[maxn*maxn],q[maxn*maxn];
int vis[maxn];
char s[maxn];
struct node{
int num,sum;
}now;
bool flag;
int n;
int cntq=1,cntp=1;
int headp[maxn],headq[maxn];
void addp(int a,int b){
p[cntp].from=a;
p[cntp].to=b;
p[cntp].nxt=headp[a];
headp[a]=cntp++;
}
void addq(int a,int b){
q[cntq].from=a;
q[cntq].to=b;
q[cntq].nxt=headq[a];
headq[a]=cntq++;
}
void bfsp(){
for(int i=0;i<n;i++){
if(headp[i]!=-1){
memset(vis,0,sizeof(vis));
queue<node>que;
que.push(node{i,0});
while(!que.empty()){
now=que.front();
que.pop();
if(now.sum>=2){
flag=false;
return;
}
for(int j=headp[now.num];j!=-1;j=p[j].nxt){
if(vis[p[j].to]==0){
vis[p[j].to]=1;
que.push(node{p[j].to,now.sum+1});
}
}
}
}
}
}
void bfsq(){
for(int i=0;i<n;i++){
if(headq[i]!=-1){
memset(vis,0,sizeof(vis));
queue<node>que;
que.push(node{i,0});
while(!que.empty()){
now=que.front();
que.pop();
if(now.sum>=2){
flag=false;
return;
}
for(int j=headq[now.num];j!=-1;j=q[j].nxt){
if(vis[q[j].to]==0){
vis[q[j].to]=1;
que.push(node{q[j].to,now.sum+1});
}
}
}
}
}
}
int main() {
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(headp,-1,sizeof(headp));
memset(headq,-1,sizeof(headq));
for(int i=0;i<n;i++){
scanf("%s",s);
for(int j=0;j<n;j++){
if(s[j]=='P'){
addp(i,j);
}else if(s[j]=='Q'){
addq(i,j);
}
}
}
flag=true;
bfsp();
if(flag)bfsq();
if(flag)printf("T\n");
else printf("N\n");
}
return 0;
}
【图论】HDU 5961 传递的更多相关文章
- 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 Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若 ...
- HDU 5961 传递
http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意: 思路: 话不多说,直接暴力. #include<iostream> #include& ...
- 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 传递】
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission ...
- 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是一个 竞赛图,当且仅当它是一个有向图且它的 ...
- HDU - 5961 传递 想法,bfs
题意:给你一个有向图,满足去掉方向是完全图,将其拆成PQ两个图(没有公共边),问你两图是否分别满足对于任意3个点a,b,c 若有一条边从a到b且有一条边从b到c ,则同样有一条边从a到c. 题解:观察 ...
随机推荐
- js中数组扁平化处理
- Readme for Software engineering
作业任务: 软件工程 软件工程 作业要求 作业要求 作业目标 博客园.github注册 自我介绍 软工5问 自我介绍: 广东工业大学计算机学院18级信息安全二班 广东工业大学AD攻防工作室成员& ...
- 工具类-Fastjson入门使用
简介 什么是Fastjson? fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到Java ...
- 常见重构技巧 - 5种方式去除多余的if else
常见重构技巧 - 去除多余的if else 最为常见的是代码中使用很多的if/else,或者switch/case:如何重构呢?方法特别多,本文带你学习其中的技巧. 常见重构技巧 - 去除多余的if ...
- MIPS 架构流水线处理器
该项目系笔者大二时计算机组成课的课程设计,源代码及完整文档请移步 Github 仓库.
- redis并发问题2
转自https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485464&idx=1&sn=8d690fc6f878 ...
- 微服务实战系列(四)-注册中心springcloud alibaba nacos
1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...
- 使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat 问题解决
这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动tomcat时,发生了读取文件错误,eclipse自动设置了断点,导致tomcat不能正常启动. 解决方法把brea ...
- 解决 SecureCRT 和 SecureFX 中文乱码
引言 最近老是有小伙伴给我发消息说,下载的 SecureCRT 和 SecureFX 安装打开后连接了自己的服务器或虚拟机后会出现中文乱码,每次都要给一一回复,我倒没事,主要是有时候因为工作的原因,所 ...
- Android App 侧边栏菜单的简单实现
效果图 Layout 注意事项 想要实现侧边栏,需要配合使用DrawerLayout.因为会用到嵌套布局,所以根布局不能是 ConstraintLayout,最好使用 LinearLayout 布局. ...