hdu 5961 传递(暴力搜索)
我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。
下图展示的是一个有4个顶点的竞赛图。

现在,给你两个有向图P = (V,Ep)和Q = (V,Ee),满足:
1. EP与Ee没有公共边;
2. (V,Ep⋃Ee)是一个竞赛图。
你的任务是:判定是否P,Q同时为传递的。
第一行有一个正整数,表示数据的组数。
对于每组数据,第一行有一个正整数n。接下来n行,每行为连续的n个字符,每 个字符只可能是’-’,’P’,’Q’中的一种。
∙如果第i行的第j个字符为’P’,表示有向图P中有一条边从i到j;
∙如果第i行的第j个字符为’Q’,表示有向图Q中有一条边从i到j;
∙否则表示两个图中均没有边从i到j。
保证1 <= n <= 2016,一个测试点中的多组数据中的n的和不超过16000。保证输入的图一定满足给出的限制条件。
题意:就不解释反正都是中文。
就是遍历所有的边然后然后判断是否符合题目条件,单纯暴力挺卡时间的,可以用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 传递(暴力搜索)的更多相关文章
- HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem ...
- HDU 5961 传递 随机化
传递 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5961 Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若 ...
- HDU 5961 传递
http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意: 思路: 话不多说,直接暴力. #include<iostream> #include& ...
- HDU 5961 传递 BFS
题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...
- hdu 5961 传递 (2016ccpc 合肥站 A题)
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- 【HDU 5961 传递】
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission ...
- HDU 5961 传递 题解
题目 我们称一个有向图G是 传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个 竞赛图,当且仅当它是一个有向图且它的 ...
- 【图论】HDU 5961 传递
题目内容 题目链接 我们称一个有向图G是传递的当且仅当对任意三个不同的顶点a,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个竞赛图,当且仅当它是一个有向图 ...
- HDU - 5961 传递 想法,bfs
题意:给你一个有向图,满足去掉方向是完全图,将其拆成PQ两个图(没有公共边),问你两图是否分别满足对于任意3个点a,b,c 若有一条边从a到b且有一条边从b到c ,则同样有一条边从a到c. 题解:观察 ...
随机推荐
- 在 alpine 中使用 NPOI
在 alpine 中使用 NPOI Intro 在 .net 中常使用 NPOI 来做 Excel 的导入导出,NPOI 从 2.4.0 版本开始支持 .netstandard2.0,对于.net c ...
- dubbo文档笔记
配置覆盖关系 以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似: 方法级优先,接口级次之,全局配置再次之. 如果级别一样,则消费 ...
- sed流编辑器
一.前言 (一).sed 工作流程 sed 是一种在线的.非交互式的流编辑器,它一次处理一行内容.处理时,把当做前处理的行存储在临时缓存区中,成为“模式空间”(pattern space),接着用se ...
- 夯实Java基础(一)——数组
1.Java数组介绍 数组(Array):是多个相同类型元素按一定顺序排列的集合. 数组是编程中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常我们可以通过数组元素的索引来访问 ...
- Asp.NetCore源码学习[2-1]:配置[Configuration]
Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...
- Spring Security (CORS)跨域资源访问配置
1.CORS介绍 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源(协议 + 域名 + 端口)服务 ...
- 11、增强型for循环对二维数组的输出(test8.java)
由于笔者原因,这部分知识,尚不能整理出代码,笔者会好好学习增强型for循环中迭代起的相关知识,在笔者有能力,书写好这段代码后,将对本篇文章,进行二次修改,也同时欢迎大家与笔者交流,共同学习,共同进步. ...
- Java虚拟机(二)-对象创建
这一篇大致说明一下,对象在Java堆中对象分配.内存布局以及访问定位 1.对象的创建 虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引 ...
- 对平底锅和垃圾的O奖论文的整理和学习[1](2018-02-08发布于知乎)
今天和杉杉同志在Pacific Coffee坐了0.4天,目前两人都处于放空状态. 这种天气有暖气真的太棒了. 我今天看的论文是这两篇: MCM2013B题O奖论文MCM2016B题O奖论文 先说第一 ...
- MongoDB Day 1
创建数据库 db.createCollection("user"); 插入字段 //----insert------- db.user.insert({uid:1, user_co ...