[BZOJ 2208] 连通数
Link:
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] 连通数的更多相关文章
- BZOJ 2208 连通数(强连通分量)
先缩点,对于缩完点后的DAG,可以直接在每个scc dfs一次就可以求出终点是这个scc的点的点对个数. # include <cstdio> # include <cstring& ...
- BZOJ 2208: [Jsoi2010]连通数 tarjan bitset
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2208: [Jsoi2010]连通数( DFS )
n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...
- bzoj 2208 [Jsoi2010]连通数
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...
- Dfs【p4306(bzoj 2208)】 [JSOI2010]连通数
Description 度量一个有向图恋情情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每 ...
- BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)
题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...
- bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】
我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...
- BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序
题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y 设f[i][j]为从i到j是否可达 首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点 缩点之后是一个拓扑图. ...
- 8月清北学堂培训 Day5
今天是杨思祺老师的讲授~ 最短路练习题: POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...
随机推荐
- 【NOIP2017 D1 T1 小凯的疑惑】
题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的 ...
- 【BZOJ 3172】[Tjoi2013]单词 AC自动机
关于AC自动机:一个在kmp与Trie的基础上建立的数据结构,关键在于Trie树结构与fail指针,他们各有各的应用.在AC自动机里最典型的就是多串匹配,原本效率为O(n*l+n*l+m*l),(n是 ...
- BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯
这个题让我认识到我以往对于图上期望概率的认识是不完整的,我之前只知道正着退还硬生生的AC做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...
- E. Sonya and Ice Cream(开拓思维)
E. Sonya and Ice Cream time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- spring中@PropertySource注解的使用
概述: The @PropertySource annotation provides a convenient and declarative mechanism for adding aPrope ...
- io流中的装饰模式对理解io流的重要性
为了说明 io流中的装饰者模式对理解io流的重要性,我想先简要介绍以下io的装饰模式. 装饰(decorator)你也可以翻译成修饰.比如:一个会精通化学数学的物理学家.在这个"物理学家&q ...
- python监控服务器
import paramikoimport threadingimport reimport timeimport stringfrom sendmail import send_maildef ss ...
- uva 11427
题目大意:每天晚上你都玩纸牌,如果第一次赢了就高高兴兴地去睡觉:如果输了就接着玩,假设每盘游戏获胜的的概率都是p,且各盘游戏相互独立.你是一个固执的完美主义者,因此会一直玩到当晚获胜局数的比例严格大于 ...
- 【Foreign】异色弧 [树状数组]
异色弧 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 8 1 ...
- 【CF103D】Time to Raid Cowavans(分块)
题意: 思路:院赛防AK题,然而还没来得及做就被数据出锅的题坑了…… #include<cstdio> #include<cstring> #include<string ...