Link:

BZOJ 2208 连通数

Solution:

传递闭包模板题

传递闭包是集合中最小的二元关系,其实就是对二元关系的不断拓展,一般用$floyd$求解

这里要先跑一遍$tarjan$求出$SCC$,然后在$TopoSort$时顺便传递闭包,最后统计答案即可

Tips:

1、在$DAG$上递推使用拓扑排序更高效,直接$dfs$时间复杂度没有保证,很可能$TLE$

2、如需对二进制位统一处理(位运算),使用$bitset$,能通过压位快32倍

3、这题$O(n*m)$和$O(\frac{n^3}{32})$的纯暴力都能过……

Code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=;
ll res=;
bool vis[MAXN],instack[MAXN];
vector<int> G[MAXN];char dat[MAXN][MAXN];
int n,in[MAXN],low[MAXN],dfn[MAXN],col[MAXN],sum[MAXN],tp=,cnt=; stack<int> s;
bitset<MAXN> f[MAXN]; void tarjan(int x)
{
dfn[x]=low[x]=++tp;
vis[x]=instack[x]=true;
s.push(x); for(int i=;i<G[x].size();i++)
{
int v=G[x][i];
if(instack[v])
low[x]=min(low[x],low[v]);
else if(!vis[v])
tarjan(v),low[x]=min(low[x],low[v]);
} if(low[x]==dfn[x])
{
int tmp=-;cnt++;
while(tmp!=x)
{
tmp=s.top();s.pop();
instack[tmp]=false;
col[tmp]=cnt;sum[cnt]++;
}
}
} void Topo_sort()
{
for(int i=;i<=cnt;i++) f[i][i]=;
queue<int> q;
for(int i=;i<=cnt;i++) if(!in[i]) q.push(i);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];f[v]|=f[u];
if(!(--in[v])) q.push(v);
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",dat[i]+);
for(int j=;j<=n;j++)
if(dat[i][j]=='') G[i].push_back(j);
} for(int i=;i<=n;i++)
if(!vis[i]) tarjan(i); for(int i=;i<MAXN;i++) G[i].clear();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(dat[i][j]=='' && col[i]!=col[j])
G[col[j]].push_back(col[i]),in[col[i]]++; Topo_sort();
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
if(f[i][j]) res+=1ll*sum[i]*sum[j]; printf("%lld",res);
return ;
}

[BZOJ 2208] 连通数的更多相关文章

  1. BZOJ 2208 连通数(强连通分量)

    先缩点,对于缩完点后的DAG,可以直接在每个scc dfs一次就可以求出终点是这个scc的点的点对个数. # include <cstdio> # include <cstring& ...

  2. BZOJ 2208: [Jsoi2010]连通数 tarjan bitset

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  3. BZOJ 2208: [Jsoi2010]连通数( DFS )

    n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...

  4. bzoj 2208 [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...

  5. Dfs【p4306(bzoj 2208)】 [JSOI2010]连通数

    Description 度量一个有向图恋情情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每 ...

  6. BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)

    题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...

  7. bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】

    我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...

  8. BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序

    题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y 设f[i][j]为从i到j是否可达 首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点 缩点之后是一个拓扑图. ...

  9. 8月清北学堂培训 Day5

    今天是杨思祺老师的讲授~ 最短路练习题: POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...

随机推荐

  1. 移动端弹窗滚动时window窗体也一起滚动的解决办法

    在做移动端项目的时候发现,如果弹窗的内容很多很长,在滑动弹窗时,蒙层下面的window窗体也会跟着一起滚动,这样带来很差的视觉体验:当时也想了很多办法,比如判断滑动的元素,如果是弹窗里面的元素则禁止w ...

  2. Grep basic and practice

    定义:Grep (Globally search for the reqular expression and print out the line). 好处:Grep 在执行时不需要先调用编辑程序, ...

  3. 网络流专题练习Day1

    04/16 一共做了8道题 首先网络流目前自己掌握的只有最大流Dinic算法和普通的费用流算法 有空还要去学习一下SAP和ZKW费用流(flag早早立在前面以后看到都有动力... 但网络流的算法个人认 ...

  4. [bzoj2599][IOI2011]Race——点分治

    Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...

  5. Linux 通过ssh传输文件

    一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响 ...

  6. windows启动redis服务

    参考:https://www.cnblogs.com/M-LittleBird/p/5902850.html 使用python的pip install redis以后还需要下载安装redis安装文件才 ...

  7. Hadoop安装过程

    1.安装JDK apt-get install openjdk-7-jdk 2.配置环境变量 vim /etc/profile 编辑: export JAVA_HOME=/usr/lib/jvm/ja ...

  8. rtmp服务端实现

    前言 网上好像没一篇讲的很完善的,可能和公司保密有关吧.先就最让人困惑(至少我是这样)且网上也很少找到答案的一个点讲一下id各是什么意思? (如果我哪里理解错了,希望大神指出,毕竟我也是看了好多资料及 ...

  9. sprintf,snprintf的用法(可以作为linux中itoa函数的补充)【转】

    转自:http://blog.csdn.net/educast/article/details/25068445 函数功能:把格式化的数据写入某个字符串 头文件:stdio.h 函数原型:int sp ...

  10. mybatis generator 生成带中文注释的model类

    将org.mybatis.generator.interal.DefaultCommentGenerator类的addFieldComment方法重写,代码如下: public void addFie ...