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. Angular 监听路由变化

    var app = angular.module('Mywind',['ui.router']) //Angular 监听路由变化 function run($ionicPlatform, $loca ...

  2. 如何加快JavaScript的加载与执行

    JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 浏览器在碰到一个引入外部JS 文件的<script>标签时会停下所有工作 ...

  3. JSOI2008 星球大战 [并查集]

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  4. 买卖股票的最佳时机 [ leetcode ]

    原题地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/description/ 给定一个数组,它的第 i 个 ...

  5. [CVPR2018]Learning to Adapt Structured Output Space for Semantic Segmentation

    学习适应结构化输出空间进行语义分割 在语义分割场景中,虽然物体在外表上不同,但是他们的输出是结构化且共享很多例如空间分布, 局部内容等信息.所以作者提出了multi-level的输出空间adaptat ...

  6. RPC-Thrift(二)

    TTransport TTransport负责数据的传输,先看类结构图. 阻塞Server使用TServerSocket,它封装了ServerSocket实例,ServerSocket实例监听到客户端 ...

  7. IDEA无法编译java8的lambda表达式提示Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式

    在idea中新建了一个java8的项目,但是写lambda表达式提示语法错误,提示如下错误信息: Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式 (请 ...

  8. WebComponents四大天王教程

    Shadow Dom: http://www.html5rocks.com/zh/tutorials/webcomponents/shadowdom/ http://www.html5rocks.co ...

  9. bzoj4764: 弹飞大爷 link-cut-tree

    题目传送门 这道题啊 调了一个晚上 因为写的是一个有根树和n个基环的写法 所以写得很奇怪..... 最后发现单独处理树的时候不能随意改变S(就是原来的根)不然size会出错.... #include& ...

  10. 计算n阶行列式的模板

    之前在学习计数问题的时候也在网上找了很多关于行列式的资料 但是发现很多地方都只介绍2\3阶的情况 一些论文介绍的方法又看不懂 然后就一直耽搁着 今天恰好出到这样的题目 发现标算的代码简介明了 还挺开心 ...