题目内容

题目链接

我们称一个有向图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. JDK安装与基础环境变量配置 入门详解 - 精简归纳

    JDK安装与基础环境变量配置 JERRY_Z. ~ 2020 / 9 / 17 转载请注明出处!️ 目录 JDK安装与基础环境变量配置 一.下载 二.安装 (1).双击.exe文件 (2).全选安装工 ...

  2. Git+Gitlab+Ansible剧本实现一键部署动态网站(5)

    项目前言 之前已经写了一篇关于git和ansible的博客<Git+Gitlab+Ansible剧本实现一键部署Nginx–技术流ken>.关于git,gitliab,ansible在我以 ...

  3. CSS、bootstrap4等相关疑难杂症

    说明 本篇博客仅用于个人随笔,所以内容比较随意. 在bootstrap4中,引入样式后,按钮.输入框等组件的选取状态会出现黑色加重边框,该如何解决? 解决示例: input:focus{outline ...

  4. ZooKeeper 入门指引

    定义 Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly ...

  5. python获取某视频网站视频

    还是老生常谈的操作 import requests import os from bs4 import BeautifulSoup from urllib.parse import urljoin h ...

  6. python-逻辑结构操作

    0x01 大纲 逻辑结构 list dict 判断if else elif break continue while 0x02 添加 list = [i for i in range(0,10)] p ...

  7. 转载:python argparse用法总结

    https://www.jianshu.com/p/fef2d215b91d 1. argparse介绍 是python的一个命令行解析包,非常编写可读性非常好的程序 2. 基本用法 prog.py是 ...

  8. explain为mysql关键字,不能作为表字段创建

    在用jpa自动建表时,字段名命名为了explain,发现报实体类与数据库表字段不一致的错,查询才发现explain是mysql的关键字,无法作为表字段建立,特此记录

  9. Spring ioc 源码分析之--beanFactory.registerResolvableDependency()方法

    背景: 在spring ioc refresh()方法中,看到了如下逻辑: 要理解该逻辑的原理,先看场景:有个接口InterFaceA,它有2个实现类A1和A2 那么,如果一个类C 依赖了InterF ...

  10. spring aop 源码分析(三) @Scope注解创建代理对象

    一.源码环境的搭建: @Component @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON,proxyMode = ScopedP ...