[Tarjan+Bitset]BZOJ2208: [Jsoi2010]连通数
来源:互联网 发布:2017年网购数据分析 编辑:程序博客网 时间:2024/06/06 00:16
题意
定义一个有向图的连通数为图中可达点对的个数(有序点对)。
给出一个N个点的有向图,求连通数。
题解
先Tarjan缩点,然后典型的在DAG上做传递闭包,用bitset优化。
复杂度
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#include<bitset>using namespace std;typedef long long LL;const int maxn=2005,maxe=maxn*maxn*2;int n,m,d[maxn],g[maxn][maxn],sz[maxn];int fir[maxn],nxt[maxe],son[maxe],tot;void add(int x,int y){ son[++tot]=y; nxt[tot]=fir[x]; fir[x]=tot;}bitset< maxn > f[maxn];queue< int > que;int dfn[maxn],low[maxn],stk[maxn],top,G,blg[maxn],Tim;LL ans;bool in_stk[maxn];void Tarjan(int x){ dfn[x]=low[x]=++Tim; stk[++top]=x; in_stk[x]=true; for(int j=fir[x];j;j=nxt[j]){ if(!dfn[son[j]]) Tarjan(son[j]), low[x]=min(low[x],low[son[j]]); else if(in_stk[son[j]]) low[x]=min(low[x],dfn[son[j]]); } if(dfn[x]==low[x]){ G++; do{ blg[stk[top]]=G; sz[G]++; in_stk[stk[top]]=false; }while(stk[top--]!=x); }}int main(){ freopen("bzoj2208.in","r",stdin); freopen("bzoj2208.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ while(getchar()!='\n'); for(int j=1;j<=n;j++){ g[i][j]=(getchar()=='1'); if(g[i][j]) add(i,j); } } for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); memset(fir,0,sizeof(fir)); tot=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(g[i][j]&&blg[i]!=blg[j]) add(blg[i],blg[j]), d[blg[j]]++; for(int i=1;i<=G;i++) if(!d[i]) que.push(i); while(!que.empty()){ int x=que.front(); que.pop(); f[x].set(x-1); for(int j=fir[x];j;j=nxt[j]){ f[son[j]]|=f[x]; if((--d[son[j]])==0) que.push(son[j]); } } for(int i=1;i<=n;i++) for(int j=1;j<=G;j++) if(f[blg[i]].test(j-1)) ans+=sz[j]; printf("%lld",ans); return 0;}
阅读全文
0 0
- [Tarjan+Bitset]BZOJ2208: [Jsoi2010]连通数
- bzoj2208 [Jsoi2010]连通数(scc+bitset)
- [BZOJ2208][Jsoi2010]连通数(tarjan+topdp)
- bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
- BZOJ2208: [Jsoi2010]连通数
- BZOJ2208: [Jsoi2010]连通数
- bzoj2208 [Jsoi2010]连通数
- bzoj2208: [Jsoi2010]连通数
- BZOJ2208 [Jsoi2010]连通数
- 【传递闭包+bitset优化】BZOJ2208 [Jsoi2010]连通数
- BZOJ2208: [Jsoi2010]连通数 Tarjan缩点+Dfs
- [BZOJ2208][Jsoi2010]连通数(dfs||tarjan+拓扑序+dp)
- bzoj2208 [Jsoi2010]连通数 dfs
- [tarjan+bitset]BZOJ 2208——[Jsoi2010]连通数
- 【BZOJ2208】[Jsoi2010]连通数【BFS/DFS】【SCC】
- 【BZOJ2208】【JSOI2010】连通数 传递闭包
- BZOJ 2208 [Jsoi2010]连通数 tarjan缩点+bitset优化DP
- bzoj 2208: [Jsoi2010]连通数 (dfs|tarjan+bitset+拓扑序)
- 在eclipse maven项目中使用mybatis-generator插件
- java学习【web基础-BOM编程,事件编程,DOM编程,正则表达式】
- epoll详解
- Android如果滑到最后一页那么就跳转页面
- Scrapy阅读源码分析<四>
- [Tarjan+Bitset]BZOJ2208: [Jsoi2010]连通数
- 【莫比乌斯反演】非正常套路
- 如何使用JPA的nativeQuery将查询出的信息封装为对象
- 高通处理器规格表
- Maven项目启动时报IndexOutOfBoundsException异常解决
- Redis介绍【初探】
- SQL中CONVERT转化函数的用法
- $.each()与$(selector).each()
- 【转】Rancher Server部署方式及Rancher HA环境部署