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

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

现在,给你两个有向图P = (V,Ep)和Q = (V,Ee),满足:
1.   EP与Ee没有公共边;
2.  (V,Ep⋃Ee)是一个竞赛图。
你的任务是:判定是否P,Q同时为传递的。

 
Input
包含至多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。保证输入的图一定满足给出的限制条件。
 
Output
对每个数据,你需要输出一行。如果P! Q都是传递的,那么请输出’T’。否则, 请输出’N’ (均不包括引号)。

题意:就不解释反正都是中文。

就是遍历所有的边然后然后判断是否符合题目条件,单纯暴力挺卡时间的,可以用vector来存相邻边这样会快不少。

第一个用vector过的,第二个用结构体做的比较卡时间,边比较密集的话还是用结构体比较好点否则用vector比较快

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
const int M = 2e3 + 20;
char sl[M][M];
int n;
vector<int>q[M] , p[M];
void init() {
for(int i = 0 ; i <= n ; i++) {
q[i].clear();
p[i].clear();
}
}
int dfs(int x , vector<int> g[] , char cp) {
int fi = g[x].size();
for(int i = 0 ; i < fi ; i++) {
int d = g[x][i];
int se = g[d].size();
for(int j = 0 ; j < se ; j++) {
int k = g[d][j];
if(sl[x][k] != cp) {
return 0;
}
}
}
return 1;
}
int main()
{
int t ;
scanf("%d" , &t);
while(t--) {
scanf("%d" , &n);
init();
for(int i = 1 ; i <= n ; i++) {
scanf("%s" , sl[i] + 1);
for(int j = 1 ; j <= n ; j++) {
if(sl[i][j] == 'P')
p[i].push_back(j);
if(sl[i][j] == 'Q')
q[i].push_back(j);
}
}
int flag = 0;
for(int i = 1 ; i <= n ; i++) {
if(!dfs(i , p , 'P')) {
flag = 1;
break;
}
}
if(!flag) {
for(int i = 1 ; i <= n ; i++) {
if(!dfs(i , q , 'Q')) {
flag = 1;
break;
}
}
}
if(flag)
printf("N\n");
else
printf("T\n");
}
return 0;
}
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 3e3 + 10;
char sl[M][M];
int n , e , head1[M] , head2[M];
struct ss {
int v , next;
}a[M * M] , b[M * M];
void init() {
e = 0;
for(int i = 0 ; i <= n + 1 ; i++) {
head1[i] = -1;
head2[i] = -1;
}
}
void add(int x , int y , ss s[] , int head[]) {
s[e].v = y;
s[e].next = head[x];
head[x] = e++;
}
int dfs(int t , char cp , int head[] , ss s[])
{
for(int i = head[t] ; i != -1 ; i = s[i].next) {
for(int j = head[s[i].v] ; j != -1 ; j = s[j].next) {
if(sl[t][s[j].v] == cp)
;
else
return 0;
}
}
return 1;
}
int main()
{
int t ;
scanf("%d" , &t);
while(t--) {
scanf("%d" , &n);
init();
for(int i = 1 ; i <= n ; i++) {
scanf("%s" , sl[i] + 1);
for(int j = 1 ; j <= n ; j++) {
if(sl[i][j] == 'P')
add(i , j , a , head1);
if(sl[i][j] == 'Q')
add(i , j , b , head2);
}
}
int flag = 0;
for(int i = 1 ; i <= n ; i++) {
if(!dfs(i , 'P' , head1 , a)) {
flag = 1;
break;
}
}
if(!flag) {
for(int i = 1 ; i <= n ; i++) {
if(!dfs(i , 'Q' , head2 , b)) {
flag = 1;
break;
}
}
}
if(flag)
printf("N\n");
else
printf("T\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. python 实现两个文本文件内容去重

    实现两个文本内容去重,输出两个文本不重复的结果 两个测试文本内容如下 1.txt中内容为 1 2 3 4 5 6 7 8 2.txt中内容为 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  2. 免安装版tomcat安装成服务

    安装方式(前提已经安装好了jdk,并配置了环境量): (1) 下载非exe的tomcat zip包: (2) 解压缩,如:D:\tomcat: (3) 进入D:\tomcat\bin,修改servic ...

  3. PythonDay03

    ## 第三章 ### 今日内容 1.整型 2.布尔值 3.字符串 ​ 索引​ 切片​ 步长​ 字符串的方法 4.for循环 ### 1.整型 - python3:全部是整形- python2:整形,长 ...

  4. Log4j 2 配置

    版本区别 Log4j 2 与 log4j 1.x 最大的区别在于,新版本的 log4j 2 只支持 json 与 xml,不再支持以前的 properties 资源文件 下载 log4j 的jar 包 ...

  5. Tunnel Warfare HDU - 1540 (线段树不同子树的合并)

    在抗日战争期间,华北平原广大地区进行了大规模的隧道战. 一般来说,通过隧道连接的村庄排成一列. 除了两端,每个村庄都与两个相邻的村庄直接相连. 入侵者经常对一些村庄发动袭击并摧毁其中的部分隧道. 八路 ...

  6. HelloDjango 第 07 篇:创作后台开启,请开始你的表演!

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在此之前我们完成了 django 博客首页视图的编写,我们希望首页展示发布的博客文章列 ...

  7. Java实现ZooKeeper的zNode监控

    上一篇文章已经完成了ZooKeeper的基本搭建和使用的介绍,现在开始用代码说话.参考 https://zookeeper.apache.org/doc/current/javaExample.htm ...

  8. C#.Net实现AutoCAD块属性提取

    https://blog.csdn.net/dengyiyu/article/details/2201175 本文主要给大家介绍一下SmartSoft中用C#.Net实现AutoCAD块属性提取的方法 ...

  9. 自定义GroupBox

    public partial class mGroupBox : GroupBox { private Color _TitleBackColor = Color.Black; private Fon ...

  10. Kendo-Grid for Vue API and Template

    写此博客的原因:在做项目时前端用的vue,后端用的jfinal.在前端veu中调用了kendo grid插件,但是在官方文档中对kendo grid for vue 的api和template都不太详 ...