[tarjan+bitset]BZOJ 2208——[Jsoi2010]连通数
来源:互联网 发布:网络机顶盒检测 编辑:程序博客网 时间:2024/06/05 07:35
2208: [Jsoi2010]连通数
题目描述
解题报告
这题的题目描述非常清晰,看到网上有dalao用
但是看到很多人缩点完刷拓扑啊,其实这个操作很鸡肋。学过
然后最后刷答案的时候注意一下就可以了,我开了两个数组,一个是或起来之后当前节点的状态,一个是原来的状态,这样的操作使调用
希望各位dalao能告诉我更优的方法。
#include<cstdio>#include<bitset>#include<algorithm>using namespace std;const int maxn=2005,maxm=4000005;int tot[2],lnk[maxn][2],son[maxm][2],nxt[maxm][2],x[maxn];int n,top,s[maxn],G,scc[maxn],low[maxn],dfn[maxn],tim,ans;bool ins[maxn],vis[maxn][maxn];bitset<maxn> a[maxn],b[maxn];void add(int x,int y,int id){ nxt[++tot[id]][id]=lnk[x][id];lnk[x][id]=tot[id];son[tot[id]][id]=y;}inline char _read(){ char ch=getchar(); while (ch!='0'&&ch!='1') ch=getchar(); return ch;}void tarjan(int x){ dfn[x]=++tim;low[x]=tim; s[++top]=x;ins[x]=1; for (int j=lnk[x][0];j;j=nxt[j][0]) if (!dfn[son[j][0]]){tarjan(son[j][0]);low[x]=min(low[x],low[son[j][0]]);} else if (ins[son[j][0]]) low[x]=min(low[x],dfn[son[j][0]]); if (dfn[x]==low[x]){ G++; while (s[top]!=x) scc[s[top]]=G,ins[s[top]]=0,a[G][s[top--]]=1; scc[x]=G;ins[x]=0;a[G][x]=1;top--; }}void maker(){ for (int i=1;i<=n;i++) for (int j=lnk[i][0];j;j=nxt[j][0]) if (scc[i]>scc[son[j][0]]&&!vis[scc[i]][scc[son[j][0]]]) add(scc[i],scc[son[j][0]],1),vis[scc[i]][scc[son[j][0]]];}int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (_read()=='1') add(i,j,0); for (int i=1;i<=n;i++) if (!dfn[i]) tarjan(i); for (int i=1;i<=G;i++) x[i]=a[i].count(); maker(); for (int i=1;i<=G;i++) b[i]=a[i]; for (int i=G;i>=1;i--){ int y=b[i].count();ans+=x[i]*x[i]; for (int j=lnk[i][1];j;j=nxt[j][1]){ ans+=(y-(b[i]&b[son[j][1]]).count())*x[son[j][1]]; b[son[j][1]]=b[son[j][1]]|b[i]; } } printf("%d\n",ans); return 0;}
阅读全文
0 0
- [tarjan+bitset]BZOJ 2208——[Jsoi2010]连通数
- bzoj 2208 [Jsoi2010]连通数 bitset
- BZOJ 2208 [Jsoi2010]连通数 tarjan缩点+bitset优化DP
- bzoj 2208: [Jsoi2010]连通数 (dfs|tarjan+bitset+拓扑序)
- [Tarjan+Bitset]BZOJ2208: [Jsoi2010]连通数
- BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序
- bzoj 2208: [Jsoi2010]连通数
- 【BZOJ 2208】 [Jsoi2010]连通数
- bzoj 2208: [Jsoi2010]连通数
- bzoj 2208: [Jsoi2010]连通数
- BZOJ 2208: [Jsoi2010]连通数
- BZOJ 2208 [Jsoi2010]连通数
- BZOJ 2208: [Jsoi2010]连通数
- BZOJ 2208 [Jsoi2010]连通数
- 2208: [Jsoi2010]连通数(Trajan+bitset)
- bzoj 2208: [Jsoi2010]连通数 拓扑排序+强连通分量+bitset
- BZOJ 2208 JSOI 2010 连通数 Tarjan+bitset
- 2208: [Jsoi2010]连通数(tarjan + 状态压缩)
- VM222:2 pages/two/two.json 未找到入口 pages/two/two.json 文件,或者文件读取失败,请检查后重新编译。
- 数据类型及其存储位置
- 62. Unique Paths
- Linux shell 进程管理
- Port already in use: 1099 的解决办法
- [tarjan+bitset]BZOJ 2208——[Jsoi2010]连通数
- 偷偷水题应该没人看见吧
- jvisualvm 连接远程 tomcat
- java io操作
- char *a 与char a[]所占空间解析题
- Java语言高编——异常
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- BZOJ 2654 [整体二分][MST]
- 保证service不被杀死