首页 > 其他分享 >[JSOI2010]连通数

[JSOI2010]连通数

时间:2022-10-27 19:34:21浏览次数:47  
标签:JSOI2010 int 连通数 bitset 顶点 com

传送地址:https://www.luogu.com.cn/problem/P4306

题目描述

度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对个的个数。

如图

顶点 11 可达 1, 2, 3, 4, 51,2,3,4,5

顶点 22 可达 2, 3, 4, 52,3,4,5

顶点 33 可达 3, 4, 53,4,5

顶点 4, 54,5 都只能到达自身。

所以这张图的连通数为 1414。

给定一张图,请你求出它的连通数

 

题解

这题打了半天,发现用dfs或者bfs都是会TLE

于是就想采用另一种方法:bitset

 这样我们就可以用0代表不能到达,1代表可以到达

最后对对可以到的的进行求和即可

另外,关于bitset的使用以及函数调用,请参考:https://cplusplus.com/reference/bitset/bitset/?kw=bitset

其他就不多赘述了。

AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=2e3+5;
 4 bitset<N> B[N];//给每一个节点建立bitset
 5 int main()
 6 {
 7     int n;cin>>n;
 8     for(int i=1;i<=n;i++){
 9         string s;cin>>s;
10         for(int j=1;j<=n;j++){
11             if(s[j-1]=='1'||i==j) B[i][j]=1;
12                         //能到这个节点或者自己
13         }
14     }
15     for(int i=1;i<=n;i++){
16         for(int j=1;j<=n;j++){
17             if(B[j].test(i)) B[j]|=B[i];
18                         //如果j可以到达i,则i可以到达的所有节点j都能到达
19                        //这里的“|”在此不在讲述
20         }
21     }
22     int ans=0;
23     for(int i=1;i<=n;i++) ans+=B[i].count();//计算有多少个1
24     cout<<ans<<endl;
25     return 0;
26 }        

 

标签:JSOI2010,int,连通数,bitset,顶点,com
From: https://www.cnblogs.com/ziyistudy/p/16833405.html

相关文章

  • Luogu P4171 [JSOI2010]满汉全席
    题目链接:​​传送门​​2-sat板子题注意输入的时候可不要以为w和h后面数字只有一位*/#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#includ......
  • [JSOI2010]冷冻波
    [JSOI2010]冷冻波题目描述WJJ喜欢“魔兽争霸”这个游戏。在游戏中,巫妖是一种强大的英雄,它的技能FrozenNova每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是......
  • NC20185 [JSOI2010]缓存交换
    题目原题地址:[JSOI2010]缓存交换题目编号:NC20185题目类型:堆、贪心时间限制:C/C++1秒,其他语言2秒空间限制:C/C++262144K,其他语言524288K1.题目大意Cache容量以及......
  • 题解P2143 [JSOI2010] 巨额奖金
    题意就是让你求有多少种最小生成树生成树用kruskal求就好了我们考虑用dfs中用乘法原理去计数#include<bits/stdc++.h>#defineN1000100usingnamespacestd;ty......