bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
2017-09-15 11:07
441 查看
首先用tarjan缩点,重建图,变成DAG,然后拓扑排序+bitset传递闭包。
#include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f 4000 #define pa pair<int,int> #define N 2010 inline 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 ,low ,dfnum=0,bel ,sz ,scc=0,in ,Topo ,num=0,ans=0; bool mp ,mp1 ,inq ; char S ; bitset<N>f ; 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; }
相关文章推荐
- BZOJ 2208: [Jsoi2010]连通数 tarjan bitset
- [tarjan+bitset]BZOJ 2208——[Jsoi2010]连通数
- 【BZOJ2208】[Jsoi2010]连通数【BFS/DFS】【SCC】
- 【BZOJ 2208】 [Jsoi2010]连通数
- bzoj 2208: [Jsoi2010]连通数 拓扑排序+强连通分量+bitset
- bzoj2208 [Jsoi2010]连通数(scc+bitset)
- BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序
- bzoj 2208: [Jsoi2010]连通数
- 暴力【bzoj2208】: [Jsoi2010]连通数
- 2208: [Jsoi2010]连通数 - BZOJ
- BZOJ 2208: [Jsoi2010]连通数
- [BZOJ2208][Jsoi2010]连通数(tarjan+topdp)
- BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)
- Dfs【p4306(bzoj 2208)】 [JSOI2010]连通数
- BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset
- BZOJ 2208 [Jsoi2010]连通数 - Tarjan_SCC/Floyd+bitset优化
- bzoj 2208: [Jsoi2010]连通数
- 【BZOJ】2208 [Jsoi2010]连通数
- 【bzoj 2208】[Jsoi2010]连通数(dfs||Tarjan算法+拓扑序+dp)
- BZOJ 2208: [Jsoi2010]连通数