题目内容

题目链接

我们称一个有向图G是传递的当且仅当对任意三个不同的顶点a,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。

我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图。换句 话说,将完全图每条边定向将得到一个竞赛图。

下图展示的是一个有4个顶点的竞赛图。



现在,给你两个有向图P=(V,\(E_p\))和Q=(V,\(E_e\)),满足:

  1. \(E_P\)与\(E_e\)没有公共边;
  2. (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 传递的更多相关文章

  1. HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))

    传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)     Problem ...

  2. HDU 5961 传递 随机化

    传递 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5961 Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若 ...

  3. HDU 5961 传递

    http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意: 思路: 话不多说,直接暴力. #include<iostream> #include& ...

  4. HDU 5961 传递 BFS

    题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...

  5. hdu 5961 传递 (2016ccpc 合肥站 A题)

    传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  6. 【HDU 5961 传递】

    Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission ...

  7. hdu 5961 传递(暴力搜索)

    我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全 ...

  8. HDU 5961 传递 题解

    题目 我们称一个有向图G是 传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个 竞赛图,当且仅当它是一个有向图且它的 ...

  9. HDU - 5961 传递 想法,bfs

    题意:给你一个有向图,满足去掉方向是完全图,将其拆成PQ两个图(没有公共边),问你两图是否分别满足对于任意3个点a,b,c 若有一条边从a到b且有一条边从b到c ,则同样有一条边从a到c. 题解:观察 ...

随机推荐

  1. js中数组扁平化处理

  2. Readme for Software engineering

    作业任务: 软件工程 软件工程 作业要求 作业要求 作业目标 博客园.github注册 自我介绍 软工5问 自我介绍: 广东工业大学计算机学院18级信息安全二班 广东工业大学AD攻防工作室成员& ...

  3. 工具类-Fastjson入门使用

    简介 什么是Fastjson? fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到Java ...

  4. 常见重构技巧 - 5种方式去除多余的if else

    常见重构技巧 - 去除多余的if else 最为常见的是代码中使用很多的if/else,或者switch/case:如何重构呢?方法特别多,本文带你学习其中的技巧. 常见重构技巧 - 去除多余的if ...

  5. MIPS 架构流水线处理器

    该项目系笔者大二时计算机组成课的课程设计,源代码及完整文档请移步 Github 仓库.

  6. redis并发问题2

    转自https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485464&idx=1&sn=8d690fc6f878 ...

  7. 微服务实战系列(四)-注册中心springcloud alibaba nacos

    1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...

  8. 使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat 问题解决

    这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动tomcat时,发生了读取文件错误,eclipse自动设置了断点,导致tomcat不能正常启动. 解决方法把brea ...

  9. 解决 SecureCRT 和 SecureFX 中文乱码

    引言 最近老是有小伙伴给我发消息说,下载的 SecureCRT 和 SecureFX 安装打开后连接了自己的服务器或虚拟机后会出现中文乱码,每次都要给一一回复,我倒没事,主要是有时候因为工作的原因,所 ...

  10. Android App 侧边栏菜单的简单实现

    效果图 Layout 注意事项 想要实现侧边栏,需要配合使用DrawerLayout.因为会用到嵌套布局,所以根布局不能是 ConstraintLayout,最好使用 LinearLayout 布局. ...