题目:

小Z最近喜欢上了图论,于是他研究了一下图的连通性问题。但是他遇到了一个难题。

给定一个n个点的有向图,求有多少点对(i,j)满足从i点出发能到达点j ?

小Z仅会简单的朴素算法,所以他想问问你怎么解决。

你能帮帮他吗?

输入/输出格式

第一行一个数字n,表示有n个点。

接下来n行,每行n个0/1,如果第i行第j个是1,表示从第i个点向第j个点有连边。

输出仅包含一个数,表示满足条件的点对数量。

样例输入/输出

Input:

3

0 1 0

0 0 1

1 0 0

Output:

9

样例解释

从任意一个点出发均可到达其它所有点(包括自己)

数据范围与约定

      对于50%的数据,满足n<=500

对于100%的数据,满足n<=2000

注意i和j可以相同

好吧,大家一看到这道题,心想:有向图判断连通,SB都会(蒟蒻瑟瑟发抖)。。

然后我们看到了数据范围。。

恩。。

好像O(n^3)不能过?

然后N(n^2logn)就能过了?

然后各种奇特算法就冒了出来。。

计算强联通分量。。。(tarjan+拓补?(by hzwer))

结果蒟蒻认为非常的难,就写了个暴力,拿了40分、

结果学长给出正解。

floyd....

floyd?不会T?

是的,不会T,因为我们拥有了一个新数据结构!

BITSET!!!!

科普一下。

首先用bitset要#include<bitset>

同时要定义的时候要这么写:bitset<位数> 名称([数组]可加可不加)

先来理解一下bitset到底是什么东东。

众所周知,1个bool值有2种可能 0或1

那么一个bitset就像是n个bool值用二进制叠了起来,如:001010

所以还是O(N)啊?

不对,因为一个二进制数为1bit

而一个int为32bit

所以复杂度为O(N^3)/32

神奇的过了。。

然后再来讲一讲具体的应用

首先bitset最常用的就是count()函数,他能找出bitset中1的数量(复杂度玄学)

本题中我们将floyd简化

原来3个循环,现在2个。

bitset<2005> b[2005]

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

if(b[j][i])b[j]|=b[i];

就是说如果j能走到i,那么i能走到的地方j一定能走到。

最后统计答案即可(b[i].count()的函数返回值即为i能到达的点的个数(包括i自己))

下面贴代码

#include<iostream>
#include<cstdio>
#include<bitset>
#define r register
using namespace std;
bitset<> b[];
int n;
int ans;
int main(){
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
scanf("%d",&n);
for(r int i=;i<=n;i++)
for(r int j=;j<=n;j++)
{
int x;
scanf("%d",&x);
b[i][j]=(x|(i==j));
}
for(r int i=;i<=n;i++)
for(r int j=;j<=n;j++)
if(b[j][i])b[j]|=b[i];
for(r int i=;i<=n;i++)
ans+=b[i].count();
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
}

小Z爱图论(NOIP信(sang)心(bin)赛)From FallDream的更多相关文章

  1. 小Z爱序列(NOIP信(sang)心(bin)赛)From FallDream(粗制单调队列&单调栈的算法解析)

    原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件 ...

  2. 小Z爱划水(NOIP信(sang)心(bin)赛)From FallDream

    题目: 小Z在机房.他和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同 ...

  3. 【20170920校内模拟赛】小Z爱学习

    所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...

  4. 【0521模拟赛】小Z爱数学

    题目描述 小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和. 小Z发现还是很水,所以他决定加大难度. 求 小Z还准备了很多个询问.现在你来解决一下吧. 输入 ...

  5. 【0521模拟赛】小Z爱划水

    题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他 ...

  6. 2017-10-5模拟赛T2 小Z爱排序(sorting.*)

    Description Solution 比赛时找到了规律,但是没有证出来……(当然最后还是AC了……) 显然没有被操作的数在排好序的序列中一定是连续的一段. 所以,没有被操作的数一定从左到右连续地递 ...

  7. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  8. 【BZOJ2038】【莫队】小z的袜子

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...

  9. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

随机推荐

  1. POJ 2084 Catalan

    Game of Connections Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8772   Accepted: 43 ...

  2. 尺取法 poj 2566

    尺取法:顾名思义就是像尺子一样一段一段去取,保存每次的选取区间的左右端点.然后一直推进 解决问题的思路: 先移动右端点 ,右端点推进的时候一般是加 然后推进左端点,左端点一般是减 poj 2566 题 ...

  3. 散列--数据结构与算法JavaScript描述(8)

    散列 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用. 散列使用的数据结构叫做散列表. 在散列表上插入.删除和取用数据都非常快,但是对于查找操作来说却效率低下,比如查找一组数据中的最大 ...

  4. 存在チェックのみする場合はcount(*)でOK

    SELECT SINGLE COUNT(*) FROM T001 WHERE BUKRS = P_BUKRS. IF SY-SUBRC <> 0. ENDIF.

  5. 7.Mongodb安全性流程

    1.安全性流程 2.超级管理员 为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户 采用了角色-用户-数据库的安全管理方式 常用系统角色如下: root:只 ...

  6. 自定义控件的getChildCount

    我真的是一步一步走过来,看过来的代码.不是能力问题,而是他们用的,我没用过,我用的他们不用.然后一句一句的问为什么,然后一句一句的去想为什么. 只有这样,才能慢慢的熟悉,东一榔头西一棒子,不是分模块再 ...

  7. 运行SparkStreaming程序时出现 Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.ArrowA异常

    Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.ArrowA 这个问题是版本不统一导致的 ...

  8. linux 检测进程是否存在

    1. 直接遍历/proc目录 int find_pid_by_name( char* pidname, pid_t *pidlist) { #define READ_BUF_SIZE 256 DIR ...

  9. 《算法》C++代码 Floyd

    今天写写最短路径的Floyd算法(有翻译叫弗洛伊德,不过这奇葩翻译用来读读就好……). 这个算法的实质,广义来讲,其实是DP(动态规划).其实按说,算法应该先说说什么贪心.搜索.DP.二分之类的基本算 ...

  10. leetcode 【 Remove Duplicates from Sorted List II 】 python 实现

    题目: Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct  ...