题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y

设f[i][j]为从i到j是否可达

首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点

缩点之后是一个拓扑图。我们求出拓扑序,沿着拓扑序从后向前DP,状态转移方程为:

f[i][k]=or{ f[j][k] } (i有直连边到达j,1<=k<=n,n为强连通分量的个数)

鉴于每一个点的值仅仅会是1或者0。所以我们能够直接状压,或者干脆开bitset,总体取或就可以

时间复杂度O(mn/32)

今天各种手滑。。。

Tarjan不赋值dpt和low,拓扑序求出来不用。各种调用错数组。。。最终彻底脑残了好开心233 QAQ

#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 2014
using namespace std;
int n,ans,map[M][M],topo_map[M][M];
int dpt[M],low[M],v[M],cnt,belong[M],siz[M],_n,stack[M],top;
int into[M],q[M],r,h;
bitset<M>f[M];
void Tarjan(int x)
{
int y;
dpt[x]=low[x]=++cnt;
stack[++top]=x;
for(y=1;y<=n;y++)
if(map[x][y])
{
if(v[y])
continue;
if(dpt[y])
low[x]=min(low[x],dpt[y]);
else
Tarjan(y),low[x]=min(low[x],low[y]);
}
if(dpt[x]==low[x])
{
int t;
++_n;
do{
t=stack[top--];
belong[t]=_n;
v[t]=1;
++siz[_n];
}while(t!=x);
}
}
void Topology_Sort()
{
int i,y;
for(i=1;i<=_n;i++)
if(!into[i])
q[++r]=i;
while(r!=h)
{
int x=q[++h];
for(y=1;y<=_n;y++)
if(topo_map[x][y])
{
into[y]--;
if(!into[y])
q[++r]=y;
}
}
}
int main()
{
int i,j,x;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%1d",&map[i][j]);
for(i=1;i<=n;i++)
if(!v[i])
Tarjan(i);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]&&belong[i]!=belong[j])
{
if(!topo_map[belong[i]][belong[j]])
into[belong[j]]++;
topo_map[belong[i]][belong[j]]=1;
f[belong[i]][belong[j]]=1;
}
for(i=1;i<=_n;i++)
f[i][i]=1;
Topology_Sort();
for(i=_n;i;i--)
{
x=q[i];
for(j=1;j<=_n;j++)
if(topo_map[x][j])
f[x]|=f[j];
}
for(i=1;i<=_n;i++)
for(j=1;j<=_n;j++)
if(f[i][j])
ans+=siz[i]*siz[j];
cout<<ans<<endl;
}

BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序的更多相关文章

  1. BZOJ 2208: [Jsoi2010]连通数 tarjan bitset

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. BZOJ 2208: [Jsoi2010]连通数( DFS )

    n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...

  3. bzoj 2208 [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...

  4. BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)

    题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...

  5. bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】

    我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...

  6. 2208: [Jsoi2010]连通数 - BZOJ

    Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图 ...

  7. 【BZOJ】2208 [Jsoi2010]连通数

    [题意]给定n个点的有向图,求可达点对数(互相可达算两对,含自身).n<=2000. [算法]强连通分量(tarjan)+拓扑排序+状态压缩(bitset) [题解]这题可以说非常经典了. 1. ...

  8. 2208: [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1371  Solved: 557[Submit][Status ...

  9. 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp

    题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...

随机推荐

  1. Android(java)学习笔记196:ContentProvider使用之内容观察者01

    1. 内容观察者 不属于四大组件,只是内容提供者ContentProvider对应的小功能. 如果发现数据库内容变化了,就会立刻观察到. 下面是逻辑图:       当A应用中银行内部的数据发生变化的 ...

  2. 模板BSGS(SDOI2011计算器) 模板EXBSGS

    BSGS和EXBSGS是OI中用于解决A^xΞB(mod C)的常用算法. 1.BSGS BSGS用于A,C互质的情况. 令m=sqrt(C),此时x可表示为i*m+j. 式中i和j都<=sqr ...

  3. buf.slice()

    buf.slice([start[, end]]) start {Number} 默认:0 end {Number} 默认:buffer.length 返回:{Buffer} 返回一个指向相同原始内存 ...

  4. day 21 03 补全异常处理

    day 21 03  异常处理(补全) 1.异常处理的整体几个语句: try: .......#有可能出错的代码 ret=int(input('number >>>')) print ...

  5. Linux最常用的基础命令 下篇

    Linux最常用的基础命令个人总结 shell脚本 脚本就是:写一堆指令存成一个文本,用于完成一些小任务 a="123" linux中定义一个变量 echo $a echo $b ...

  6. [bzoj1078][SCOI2008][斜堆] (贪心)

    Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结 ...

  7. Vue如何引入jquery实现平滑滚动到指定位置效果

    在以往的做法里首选jquery的animate实现,但是Vue里并没有这个方法.如何在Vue项目中实现点击导航平滑滚动到指定位置,为了这效果我是快要崩溃了,上网查阅了很久发现并没有真正意义上解决这个问 ...

  8. 解决Antimalware Service Executable CPU,内存占用高的问题

    1.win键+R键打开运行对话框框,输入gpedit.msc打开本地组策略编辑器(组策略):2.依次打开计算机配置-管理模板-Windows组件-Windows Defender:3.如果要关闭Win ...

  9. Quartz.Net 学习之路01 安装Quartz.Net

    Quartz.Net 系列文章的第一篇,至于Quartz.Net 是做什么的我就不介绍了,相信要用到它的都知道它是用来干嘛的: Quartz.Net安装方法: 1.打开项目,在VS“工具”菜单选中“库 ...

  10. Jmeter&Ant构建自动化测试平台

    JMeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术. Apache软件基金会的Stefano Mazzocchi JMeter的最初的开发.他写道:它主要对 Apache ...