我们称一个有向图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. DevOps相关知识点

    DevOps 持续集成 简述 持续集成简称CI,是软件的开发和发布标准流程的最重要的部分 作为一个开发实践,在C中可以通过自动化等手段高频地去获取产品反馈并响应反馈的过程 简单的来说,持续集成就是持续 ...

  2. Js面向对象构造函数继承

    构造函数继承 <!-- 创建构造函数 --> function Animal(){ this.species= '动物'; } function Dog(name,color){ this ...

  3. maven的编译规范

    maven的中央仓库上的jar的包名必须小写.否则maven编译不通过. 如:Memcached-Java-Client-3.0.2 的jar包. 目录如下: com.whalin.memcached ...

  4. 大数阶乘(c++实现)

    #include <iostream>using namespace std;#define N 1000int BigNumFactorial(int Num[], int n);voi ...

  5. [Chat]实战:仿网易云课堂微信小程序开发核心技术剖析和经验分享

    本Chat以一个我参与开发并已上线运营近2年——类似网易云课堂的微信小程序项目,来进行微信小程序高级开发的学习. 本场Chat围绕项目开发核心技术分析,帮助你快速掌握在线视频.音频类小程序开发所需要的 ...

  6. .lib .dll 区别介绍、使用(dll的两种引入方式)

    .lib .dll文件都是程序可直接引用的文件,前者就是所谓的库文件,后者是动态链接库(Dynamic Link Library)也是一个库文件.而.pdb则可以理解为符号表文件.DLL(Dynami ...

  7. cogs 1254. 最难的任务 Dijkstra + 重边处理

    1254. 最难的任务 ★   输入文件:hardest.in   输出文件:hardest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 这个真的很难.算出 123 ...

  8. Go中的日志及第三方日志包logrus

    有别的语言使用基础的同学工作中都会接触到日志的使用,Go中自然也有log相关的实现.Go log模块主要提供了3类接口,分别是 "Print .Panic .Fatal ",对每一 ...

  9. .netcore持续集成测试篇之测试方法改造

    系列目录 通过前面两节讲解,我们的测试类中已经有两个测试方法了,总体上如下 public class mvc20 { private readonly HttpClient _client; publ ...

  10. 深入分析Java的编译期与运行期

    不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的 ...