【bitset】【推导】hdu5961 传递

<法一>http://blog.csdn.net/u014325920/article/details/53046890

1、判断传递的条件为:若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。 
2、我们去枚举b,我们假设集合Sb={x|x?>b}表示有一条x指向b的边。我们假设集合Tb={x|b?>x},表示有有一条b指向x的边。 
3、我们再去枚举Sb中的元素,假设我们当前枚举的是x,因为x是指向b的,所以我们根据题意容易得知该图是传递图的话一定满足:Tx∩Tb=Tb,然后就可以得出答案了,至于怎么处理集合的并,我们可以用bitset搞搞就可以了!!!具体看代码。

<法二>http://www.cnblogs.com/zarth/p/6671252.html

给出法一的代码

#include<cstdio>
#include<bitset>
using namespace std;
bitset<2030> S[2030];
int T,n;
char a[2030][2030];
int main(){
	scanf("%d",&T);
	for(;T;--T){
		for(int i=1;i<=n;++i){
			S[i].reset();
		}
		scanf("%d",&n);
		for(int i=1;i<=n;++i){
			scanf("%s",a[i]+1);
		}
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j){
				if(a[i][j]==‘P‘){
					S[i].set(j);
				}
			}
		}
		bool flag=1;
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j){
				if(a[i][j]==‘P‘){
					if((S[j]|S[i])!=S[i]){
						flag=0;
						goto OUT;
					}
				}
			}
		}
		OUT:
		if(!flag){
			puts("N");
			continue;
		}
		flag=1;
		for(int i=1;i<=n;++i){
			S[i].reset();
		}
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j){
				if(a[i][j]==‘Q‘){
					S[i].set(j);
				}
			}
		}
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j){
				if(a[i][j]==‘Q‘){
					if((S[j]|S[i])!=S[i]){
						flag=0;
						goto OUT2;
					}
				}
			}
		}
		OUT2:
		if(!flag){
			puts("N");
		}
		else{
			puts("T");
		}
	}
	return 0;
}
时间: 2024-10-06 21:17:41

【bitset】【推导】hdu5961 传递的相关文章

python 函数的参数定义及调用

参数定义:1. 位置参数:    这是熟悉的标准化参数,位置参数必须在调用函数中定义的准确顺序来传递,在没有默认参数的情况下,传入参数    的精确数目必须和声明的数目一致. def foo(who, name): print('{0} is {1}'.format(who, name) foo函数有两个位置参数,那么意味这foo的调用必须有两个参数,不能多也不能少2. 默认参数: 定义默认参数的如下: def func(posargs, defargs=dval, defargs2=dval2

POJ3275:Ranking the Cows(Bitset加速floyd求闭包传递)

Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positive rate, and FJ would like to order his cows according to these rates from the fastest milk producer to the slowest. FJ has already compared the milk output rate for M (1

[CSP-S模拟测试]:传递(暴力+bitset)

题目描述 我们称一个有向图$G$是传递的,当且仅当对于图$G$的三个不同顶点$a,b,c$,若图$G$中有一条边从$a$到$b$且有一条边从$b$到$c$,那么图中也有一条边从$a$到$c$.我们称一个图$G$是竞赛图,当且仅当它是一个有向图且它的基图是完全图.也就是,将无向完全图的每条边重新定向就能得到一个竞赛图.现在,给定两张有向图$P=(V,E_P)$和$Q=(V,E_Q)$,满足:$E_p$和$E_q$没有公共边,且图$(V,E_P\cup E_Q)$是一个竞赛图.你的任务是:判定有向图

HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))

传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c.我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图.换句 话说,将完全图每条边定向将得到一个竞赛图.下图展示的是一个有4个顶点的竞

bzoj1045 糖果传递

escription 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖果, 甚至一颗也没有 ?, 设第i个小朋友有ai颗糖果. 小朋友们可以选择将一些糖果给他左边的或者右边的小朋友, 通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的, 假设一颗糖果从一个小朋友传给另一个

bitset

bitset这个东西,是c++里面封装好了的处理多位运算的东西. 亲测比自己写快10倍以上. 以下是概念: std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位.下面看一个例子: #include<bitset> std::bitset<8> bs;//它是一个模板,传递的参数告诉编译器bs有8个位. 我们接着看上面的代码,通过上面两行

python 推导式和迭代器、生成器

1.常用推导式 推导式是从一个或者多个迭代器快速简洁创建数据结构的一种方法. 1.1 _ 列表推导式 最简单的形式:  [exprssion for item in iterable] 示例:  number_list = [x for x in range(1,10)]  加上条件表达式的形式:  [exprsssion for item in iterable if condition]  示例: a_list = [x for x in range(1,7) if x %2 ==1] 多个

BP神经网络推导过程详解

BP算法是一种最有效的多层神经网络学习方法,其主要特点是信号前向传递,而误差后向传播,通过不断调节网络权重值,使得网络的最终输出与期望输出尽可能接近,以达到训练的目的. 一.多层神经网络结构及其描述 下图为一典型的多层神经网络. 通常一个多层神经网络由L层神经元组成,其中:第1层称为输入层,最后一层(第L层)被称为输出层,其它各层均被称为隐含层(第2层~第L-1层). 令输入向量为: \[ \vec x = [x_1 \quad x_2 \quad \ldots \quad x_i \quad

Python学习笔记2:构造序列:列表推导和生成器表达式

欢迎访问个人网站:www.comingnext.cn 1. 关于Python内置序列类型 a. 按能否存放不同类型的数据区分 容器序列: list.tuple 和collections.deque这些序列能存放不同类型的数据 扁平序列: str.bytes.bytearray.memoryview和array.array,这类序列只能容纳一种类型. b. 按能否被修改来分类 可变序列: list.bytearray.array.array.collections.deque 和 memoryvi