Description

Input

输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。

Output

输出一行一个整数,表示该图的连通数。

HINT

对于100%的数据,N不超过2000。

Solution

\(Tarjan\) 缩点 \(+\) 拓扑排序 \(+\) \(bitset\) 优化状压

显然对于每个强联通分量我们都要求出在新图上它能到达哪些点。

如何求呢?

法一: \(dfs\),对于每个强联通分量找一下它连出去的边能到达哪些联通块,统计答案即可。复杂度 \(O(n^2)\)。(只是口胡一下没有写这种方法如果写不出来别找我)

法二:我们定义数组 \(f[i][j]\) 表示能否从第 \(i\) 个连通分量到达第 \(j\) 个连通分量。因为值只能为 \(0/1\),我们用 \(bitset\) 来状压第二维。因为 \(f[j]=or(f[i]),j\;can\;go\;to\;i\),所以我们在新图上建立一张反图,拓扑排序,按照拓扑序即可求出每个点能到达哪些点。 复杂度 \(O(n^2/32)\)。

Code

#include<queue>
#include<bitset>
#include<cstdio>
#include<cctype>
#include<iostream>
#define N 2005
#define min(A,B) ((A)<(B)?(A):(B))int ans;
char ch[N];
bool in[N];
int n,cnt,sum,tot;
int dfn[N],low[N];
std::bitset<N> f[N];
std::queue<int> topo;
int belong[N],deg[N];
int head[N],head2[N];
int stk[N],top,sze[N];struct Edge{int to,nxt;
}edge[N*N],edge2[N*N];void add(int x,int y){edge[++cnt].to=y;edge[cnt].nxt=head[x];head[x]=cnt;
}void add2(int x,int y){edge2[++cnt].to=y;edge2[cnt].nxt=head2[x];head2[x]=cnt;
}int getint(){int x=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x;
}void tarjan(int now){dfn[now]=low[now]=++sum;stk[++top]=now;in[now]=1;for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;if(!dfn[to]){tarjan(to);low[now]=min(low[now],low[to]);}else if(in[to])low[now]=min(low[now],dfn[to]);}if(low[now]==dfn[now]){int y; tot++;do{y=stk[top--];belong[y]=tot;sze[tot]++;in[y]=0;}while(y!=now);}
}signed main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",ch);for(int j=0;j<n;j++){if(ch[j]=='0') continue;add(i,j+1);}}cnt=0;for(int i=1;i<=n;i++){if(!dfn[i])tarjan(i);}for(int x=1;x<=n;x++){for(int i=head[x];i;i=edge[i].nxt){int to=edge[i].to;if(belong[x]==belong[to]) continue;deg[belong[x]]++;add2(belong[to],belong[x]);}}for(int i=1;i<=tot;i++)f[i][i]=1;for(int i=1;i<=tot;i++){if(!deg[i])topo.push(i);}while(topo.size()){int u=topo.front();topo.pop();for(int i=head2[u];i;i=edge2[i].nxt){int to=edge2[i].to;deg[to]--;f[to]|=f[u];if(!deg[to])topo.push(to);}}for(int i=1;i<=tot;i++){for(int j=1;j<=tot;j++){if(f[i][j])ans+=sze[i]*sze[j];}}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/YoungNeal/p/9127102.html

[JSOI2010] 连通数相关推荐

  1. 2208: [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1371  Solved: 557 [Submit][Stat ...

  2. BZOJ 2208[Jsoi2010]连通数

    题面: 2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3100  Solved: 1347 [Submit] ...

  3. bzoj2208:[Jsoi2010]连通数

    http://blog.csdn.net/u013598409/article/details/47037499 里面似乎有生成数据的... //我本来的想法是tarjan缩点之后然后将图遍历一遍就可 ...

  4. 2208: [Jsoi2010]连通数(Trajan+bitset)

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2929  Solved: 1280 [Submit][Sta ...

  5. [luoguP4306][JSOI2010]连通数

    \[Yeasion\] \[Nein\] 其实我很奇怪为什么我的正解和输出\(N \times N\)的效果是一样的.....嗯,大概是\(RP\)问题吧.... 嗯首先来看一下题目: 题目描述: 度 ...

  6. BZOJ2208 [Jsoi2010]连通数

    题目描述: 度量一个有向图连通情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 n<=2000 题解: 网上的题解有的写得很复杂,但是看到n的范围这么小,当然 ...

  7. [bzoj2208][Jsoi2010]连通数

    一道传递闭包裸题.tarjan+拓扑dp也很强而且貌似更快.本来想写的. 然而查题解的时候发现一个博主的一句话引起了我的共鸣. bzoj上这道题rank前面都是1500B+的大佬,很快,几百ms,到了 ...

  8. [BZOJ2208]:[Jsoi2010]连通数(暴力 or bitset or 塔尖?)

    题目传送门 题目描述 度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对的个数. 在上图中,顶点1可以到达1.2.3.4.5. 顶点2可以到达2.3.4.5. 顶点3可以到达3.4.5. 顶点 ...

  9. BZOJ2208:[JSOI2010]连通数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2208 floyd压位是神马东西-- 我们tarjan缩点之后反向拓扑就可以记录联通块可达状态,然后 ...

  10. bzoj2208 [Jsoi2010]连通数

    题目链接 先是强连通分量缩点,然后出来一个DAG 然后就可以DP啦,要找出每个SCC能到达的SCC有哪些 如果直接存一个二维数组来传递闭包的话肯定会TLE对吧 于是我们使用了神奇的bitset就快多了 ...

最新文章

  1. AT2667-[AGC017D]Game on Tree【SG函数】
  2. 企业需要的C++程序员
  3. Qt文档阅读笔记-Broadcast Receiver Example解析
  4. mysql 表结构反转_一道经典的MySQL面试题,答案出现三次反转
  5. 华为鸿蒙战略泄天机,谷歌最强Fuchsia OS进入狗粮测试,华为害怕?鸿蒙战略超乎你想象...
  6. geoiplookup命令没有任何输出问题
  7. yum install php72w,yum 安装 php72w-pecl-imagick 报错
  8. Codeforces Round #229 (Div. 2) 解题报告
  9. 数字图像处理第三版中文版部分答案-冈萨雷斯
  10. 【DP专题】LintCode刷题笔记
  11. 第二章笔记:计数初步
  12. 小米手机-解BL锁+开ROOT权限
  13. Citespace安装【Version Check】Your version‘s status cannot be verified due to a network connection issue
  14. 关于一个App调起另一个App
  15. Spring Boot搭建Web服务器,实现用户注册登录功能
  16. 计算机发明者约翰·冯·诺依曼
  17. 威斯康星大学硕士计算机科学,威斯康星大学麦迪逊分校计算机科学
  18. 新浪微博技术架构分析-微博首席架构师杨卫华
  19. 第十次作业 - 项目测评(团队)
  20. 干货 | 拐点已至,云原生引领数字化转型升级

热门文章

  1. 初识循环神经网络(RNN)
  2. linux opendir php,php目录遍历函数opendir用法实例
  3. Java从入门到精通 第14章 关于类的专题研究
  4. java outputstrea_java的InputStream和OutputStream的理解【转】
  5. java获取数据库列的别名_java – JDBC ResultSet获取具有表别名的列
  6. 使用Scikit-Learn,XGBoost,LightGBM和CatBoost进行梯度增强
  7. 项目合作需求、数据集合作需求
  8. html tooltip 换行,echarts在tooltip中换行操作
  9. mysql java 查寻用户_mysql 查询不同用户 最新的一条记录
  10. 2021-06-09 动态的创建对象,通过反射.