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. 题解:观察 ...
随机推荐
- Apache ActiveMQ 实践 <一>
一.下载最新版本 ActiveMq http://activemq.apache.org/activemq-5152-release.html,下载目录如下: 二.创建项目 1.普通项目 添加 jar ...
- codeforces 213div(2) 365 A.Good Number 365 B.The Fibonacci Segment
#include <stdio.h> #include <string.h> bool vis[11]; int n, k; bool judge(int x) { memse ...
- DesignPattern系列__02接口隔离原则
介绍 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上. Demo引入 先来看一张图: interface MyInterface { void operation1(); ...
- 在线图片base64编码
图片Base64编码https://oktools.net/image2base64 在线工具https://oktools.net JSON格式化https://oktools.net/json U ...
- 数据结构之最小堆的实现C++版
完全二叉树之所以用数组的方式存在,在于他的一个特性 若子节点为i,则父节点为(i-1)/2,注意c++特性,该结果肯定是个整数. 若父节点为j,则子节点必为2*j+1;则在数组里面可以非常方便的通过下 ...
- CodeGlance右侧窗口缩略图消失不见
说明下问题,idea中的CodeGlance插件会在右侧显示缩略图,可以快速定位代码.今天遇到个问题升级了插件后右侧窗口消失.经过卸载插件,重启,reset一系列操作后还是没能恢复. 能去搜索引擎搜索 ...
- Spring 常犯的十大错误,答应我 打死都不要犯好吗?
1. 错误一:太过关注底层 我们正在解决这个常见错误,是因为 “非我所创” 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的内部结构及其实现, ...
- Spring入门编程问题集锦Top10
我写的一篇文章,希望对spring初学者有所帮助: 1.如何学习Spring? 你可以通过下列途径学习spring: ①. spring下载包中doc目录下的MVC-step-by-step和samp ...
- 完整原型链详细图解之JS构造函数、原型 原型链、实例化对象
一.首先说一下什么是构造函数: 构造函数:用来在创建对象时初始化对象.特点:构造函数名一般为大写字母开头:与new运算符一起使用来实例化对象. 举例: function Person(){} //Pe ...
- c语言ld returned 1 exit status😂
在复习c语言过程中遇到, 问题:reverseLinkedList.exe: Permission denied collect2.exe: error: ld returned 1 exit sta ...