bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
来源:互联网 发布:淘宝第三方代运营投诉 编辑:程序博客网 时间:2024/06/05 14:33
首先用tarjan缩点,重建图,变成DAG,然后拓扑排序+bitset传递闭包。
#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define pa pair<int,int>#define N 2010inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}int n,dfn[N],low[N],dfnum=0,bel[N],sz[N],scc=0,in[N],Topo[N],num=0,ans=0;bool mp[N][N],mp1[N][N],inq[N];char S[N];bitset<N>f[N];stack<int>qq;void tarjan(int x){ dfn[x]=low[x]=++dfnum;qq.push(x);inq[x]=1; for(int y=1;y<=n;++y){ if(!mp[x][y]) continue; if(!dfn[y]) tarjan(y),low[x]=min(low[x],low[y]); else if(inq[y]) low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]){ ++scc;while(1){ int y=qq.top();qq.pop();inq[y]=0; bel[y]=scc;sz[scc]++;if(x==y) break; } }}void rebuild(){ for(int x=1;x<=n;++x) for(int y=1;y<=n;++y) if(mp[x][y]&&bel[x]!=bel[y]) if(!mp1[bel[x]][bel[y]]) mp1[bel[x]][bel[y]]=1,in[bel[y]]++,f[bel[x]][bel[y]]=1;}void Topology_sort(){ queue<int>q; for(int i=1;i<=scc;++i) if(!in[i]) q.push(i); while(!q.empty()){ int x=q.front();q.pop();Topo[++num]=x; for(int y=1;y<=scc;++y) if(mp1[x][y]) if(--in[y]==0) q.push(y); }}int main(){// freopen("a.in","r",stdin); n=read(); for(int i=1;i<=n;++i){ scanf("%s",S+1); for(int j=1;j<=n;++j) mp[i][j]=S[j]-'0'; } for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i); rebuild(); Topology_sort(); for(int i=1;i<=scc;++i) f[i][i]=1; for(int i=scc;i>=1;--i){ int x=Topo[i]; for(int y=1;y<=scc;++y) if(mp1[x][y]) f[x]|=f[y]; } for(int i=1;i<=scc;++i) for(int j=1;j<=scc;++j) if(f[i][j]) ans+=sz[i]*sz[j]; printf("%d\n",ans); return 0;}
阅读全文
0 0
- bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
- 【传递闭包+bitset优化】BZOJ2208 [Jsoi2010]连通数
- [Tarjan+Bitset]BZOJ2208: [Jsoi2010]连通数
- 【BZOJ2208】【JSOI2010】连通数 传递闭包
- [BZOJ2208][Jsoi2010]连通数(dfs||tarjan+拓扑序+dp)
- BZOJ2208: [Jsoi2010]连通数 Tarjan缩点+Dfs
- bzoj2208 [Jsoi2010]连通数(scc+bitset)
- [BZOJ2208][Jsoi2010]连通数(tarjan+topdp)
- BZOJ2208: [Jsoi2010]连通数
- BZOJ2208: [Jsoi2010]连通数
- bzoj2208 [Jsoi2010]连通数
- bzoj2208: [Jsoi2010]连通数
- BZOJ2208 [Jsoi2010]连通数
- bzoj 2208: [Jsoi2010]连通数 (dfs|tarjan+bitset+拓扑序)
- BZOJ 2208 [Jsoi2010]连通数 tarjan缩点+bitset优化DP
- BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序
- bzoj2208 连通数 tarjan缩点&状压常数优化
- bzoj2208 [Jsoi2010]连通数 dfs
- leetcode题解-29. Divide Two Integers
- MyBatis之延迟加载
- 颠倒的价牌
- 根据IP/掩码位获取IP的起始范围、IP总数、IP属不属于某个网段或者打印网段内所有的IP
- 页面之间传递参数
- bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
- 解决这几点,轻松搞定自媒体淘客
- mysql-5.7.17-winx64.zip 的安装与配置
- VS2010e rror LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 微信小程序 兼容用户拒绝获取位置权限 用户拒绝权限处理
- 【bug修复】ConcurrentModificationException
- 标准cmake模板(将源文件做成库)
- 服网LNMP集群 w/ MySQL PaaS-1.0
- 外网映射---内网穿透工具NATAPP---灵感源自QQ浏览器微信调试工具