我们称一个有向图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. .NET Core on K8S学习实践系列文章索引(Draft版)

    一.关于这个系列 自从去年(2018年)底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发 ...

  2. Intellij IDEA 中 使用 Git

    前一段时间使用 Microsoft 的 Visual Studio Code 中使用 Git 对前端项目进行项目代码的开发提交. 使用后感觉挺好的,用的多了也觉得挺简单方便的. 现在需要在 Intel ...

  3. maven私服nexus上传第三方jar包以及下载

    私服是一个特殊的远程仓库,它是架设在局域网内的仓库服务.私服代理广域网上的远程仓库,供局域网内的Maven用户使用.当Maven需要下载构建的使用,它先从私服请求,如果私服上没有的话,则从外部的远程仓 ...

  4. python利用select实现的Socket Server

    # 利用python的select模块实现简单的Socket Sever #实现多用户访问,再次基础上可以实现FTP Server应用程序 # 发布目的,在于解决了客户端强行终止时,服务器端也跟着程序 ...

  5. spark shuffle写操作三部曲之BypassMergeSortShuffleWriter

    前言 再上一篇文章 spark shuffle的写操作之准备工作 中,主要介绍了 spark shuffle的准备工作,本篇文章主要介绍spark shuffle使用BypassMergeSortSh ...

  6. 后端小白的VUE入门笔记, 进阶篇

    使用 vue-cli( 脚手架) 搭建项目 基于vue-cli 创建一个模板项目 通过 npm root -g 可以查看vue全局安装目录,进而知道自己有没有安装vue-cli 如果没有安装的话,使用 ...

  7. jdk安装及环境配置

    1.下载对应的安装包(我们公司用的是jdk 1.8) 2.选择对应版本,点击安装,在选择安装位置的时候,选择自己对应存放的位置,其他都点击下一步就行了,先安装jdk,后安装jre 3.环境变量,选择 ...

  8. 【Python】狂蟒来袭 | 使用Anaconda搭建Python开发环境

    这段时间转了一个小圈圈,发现又回来了,瞎忙.想要学习数据挖掘的小伙伴一定得对机器学习有所了解吧,我之前看过几页周志华老师的西瓜书,但终没能坚持下来. 人生处处是起点,什么时候都不晚.记此笔记以分享与督 ...

  9. mac下使用zerobrane调试cocos2dx的lua

    环境:MacOSx 10.9.2, Lua 5.1.4, luaSocket 2.0.2, xcode5.0.2 所需文件 luasocket-2.0.2.zip,ZeroBraneStudioEdu ...

  10. Vue 路由模块化配置

    博客地址:https://ainyi.com/77 企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化 分享两个解决方案 -- Vue 路由配置 ...