【图论】HDU 5961 传递
题目内容
题目链接
我们称一个有向图G是传递的当且仅当对任意三个不同的顶点a,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。
我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图。换句 话说,将完全图每条边定向将得到一个竞赛图。
下图展示的是一个有4个顶点的竞赛图。
现在,给你两个有向图P=(V,\(E_p\))和Q=(V,\(E_e\)),满足:
- \(E_P\)与\(E_e\)没有公共边;
- (V,\(E_p⋃E_e\))是一个竞赛图。
你的任务是:判定是否P,Q同时为传递的。
输入格式
包含至多20组测试数据。
第一行有一个正整数,表示数据的组数。
对于每组数据,第一行有一个正整数\(n\)。接下来\(n\)行,每行为连续的\(n\)个字符,每 个字符只可能是-
,P
,Q
中的一种。
- 如果第\(i\)行的第\(j\)个字符为
P
,表示有向图P中有一条边从\(i\)到\(j\); - 如果第\(i\)行的第\(j\)个字符为
Q
,表示有向图Q中有一条边从\(i\)到\(j\); - 否则表示两个图中均没有边从\(i\)到\(j\)。
保证\(1\le n\le 2016\),一个测试点中的多组数据中的\(n\)的和不超过16000。保证输入的图一定满足给出的限制条件。
样例
见链接
样例解释
在下面的示意图中,左图为图为Q。
注:在样例2中,P不是传递的。在样例4中,Q不是传递的。
输出格式
对每个数据,你需要输出一行。如果P,Q都是传递的,那么请输出T
。否则, 请输出N
。
思路
若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。
如果bfs搜到了长度超过1的路径,就意味着图不是传递的。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2020;
struct Edge{
int from,to,nxt;
}p[maxn*maxn],q[maxn*maxn];
int vis[maxn];
char s[maxn];
struct node{
int num,sum;
}now;
bool flag;
int n;
int cntq=1,cntp=1;
int headp[maxn],headq[maxn];
void addp(int a,int b){
p[cntp].from=a;
p[cntp].to=b;
p[cntp].nxt=headp[a];
headp[a]=cntp++;
}
void addq(int a,int b){
q[cntq].from=a;
q[cntq].to=b;
q[cntq].nxt=headq[a];
headq[a]=cntq++;
}
void bfsp(){
for(int i=0;i<n;i++){
if(headp[i]!=-1){
memset(vis,0,sizeof(vis));
queue<node>que;
que.push(node{i,0});
while(!que.empty()){
now=que.front();
que.pop();
if(now.sum>=2){
flag=false;
return;
}
for(int j=headp[now.num];j!=-1;j=p[j].nxt){
if(vis[p[j].to]==0){
vis[p[j].to]=1;
que.push(node{p[j].to,now.sum+1});
}
}
}
}
}
}
void bfsq(){
for(int i=0;i<n;i++){
if(headq[i]!=-1){
memset(vis,0,sizeof(vis));
queue<node>que;
que.push(node{i,0});
while(!que.empty()){
now=que.front();
que.pop();
if(now.sum>=2){
flag=false;
return;
}
for(int j=headq[now.num];j!=-1;j=q[j].nxt){
if(vis[q[j].to]==0){
vis[q[j].to]=1;
que.push(node{q[j].to,now.sum+1});
}
}
}
}
}
}
int main() {
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(headp,-1,sizeof(headp));
memset(headq,-1,sizeof(headq));
for(int i=0;i<n;i++){
scanf("%s",s);
for(int j=0;j<n;j++){
if(s[j]=='P'){
addp(i,j);
}else if(s[j]=='Q'){
addq(i,j);
}
}
}
flag=true;
bfsp();
if(flag)bfsq();
if(flag)printf("T\n");
else printf("N\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. 题解:观察 ...
随机推荐
- Python 字符串去除相邻重复的元素
1 def quchong(S): 2 str1=[""] 3 for i in S: 4 if i == str1[-1]: 5 str1.pop() 6 else: 7 str ...
- Scrapy框架的架构原理解析
爬虫框架--Scrapy 如果你对爬虫的基础知识有了一定了解的话,那么是时候该了解一下爬虫框架了.那么为什么要使用爬虫框架? 学习框架的根本是学习一种编程思想,而不应该仅仅局限于是如何使用它.从了解到 ...
- Coneology(POJ 2932)
原题如下: Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4937 Accepted: 1086 D ...
- 第24课 - #pragma 使用分析
第24课 - #pragma 使用分析 1. #pragma简介 (1)#pragma 是一条预处理器指令 (2)#pragma 指令比较依赖于具体的编译器,在不同的编译器之间不具有可移植性,表现为两 ...
- [剑指Offer]18-题目一:删除链表的节点 题目二:删除链表中重复节点
题目一 题目 O(1)时间复杂度删除给定链表节点. 题解 用待删除节点后一个节点的值覆盖待删除节点值,更新链接关系. 注意链表只有一个节点:删除尾结点:删除头节点的处理. 代码 class ListN ...
- 使用vue-cli(vue脚手架)快速搭建项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目.这篇文章将会从实操的角度,介绍整个搭建的过程. 1. 避坑前言 其实这次使用vue-cli的 ...
- 疑难杂症 | Excel VBA锁定指定单元格区域
背景:锁定EXCEL表头 一.手动操作流程 其基本逻辑并不赋值,手动操作流程是: 1.取消所有单元格的"锁定"格式 CTRL+A,选中全部的单元格→单击右键→设置单元格格式→保护→ ...
- Java操作Elasticsearch 之 [Java High Level REST Clientedit]
1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json. 向 Ela ...
- Processing 高效控制管理图形方法(二)
之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/70992924
- C面向对象: 升级版本实现:同步逻辑、少量连续失败则增补、多次连续失败则拉长同步周期
// C语言之 面向对象+虚事务的抽象 /*********** 进阶练习: (对虚的事物的抽象) 完善部门职责 ***********************/ #include <stdio ...