题目大意:给定一个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. blockdev - 从命令行调用区块设备控制程序

    总览(SYNOPSIS) blockdev [options] commands devices 描述(DESCRIPTION) blockdev 工具允许从命令行调用区块设备控制程序. 选项(OPT ...

  2. docker使用registry搭建本地私有仓库

    参考链接来自:http://blog.csdn.net/wangtaoking1/article/details/44180901/ 和Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时 ...

  3. React和webpack解决 waiting for roots to load...to reload the inspector

    使用chrome调试工具,react-devtools总是显示 "waiting for roots to load...to reload the inspector" and ...

  4. 今天被 <!doctype html> 搞了两个小时,两个页面同样的样式,chosen右边的小箭头,一个上下居中对齐 一个居顶对齐。最后找到问题所在doctype

    今天被 <!doctype html> 搞了两个小时,两个页面同样的样式,chosen右边的小箭头,一个上下居中对齐 一个居顶对齐.最后找到问题所在doctype <-- 这个小箭头

  5. python 获取路径

    获取目录路径和文件路径 import osfor root, dirs, files in os.walk(".", topdown=False): # ‘.’为获取脚本所在路径下 ...

  6. 微信小程序UI组件库 iView Weapp快速上手

    概述 今天在网上突然看到iView新出了一个微信小程序的组件库iView Weapp,自己就上手试了一下,发现用起来还是不错的,把自己使用的过程与大家分享下. 一 预览iView组件 1.可以在手机上 ...

  7. 【牛客小白月赛6】 J 洋灰三角 - 快速幂&逆元&数学

    题目地址:https://www.nowcoder.com/acm/contest/136/J 解法一: 推数学公式求前n项和: 当k=1时,即为等差数列,Sn = n+pn(n−1)/2 当k≠1时 ...

  8. xshell连接不了虚拟机处理方法(错误提示:Connection closing...Socket close.Connection closed by foreign host.Disconnected from remote host(localhost) at 08:47:23.)

    一.问题描述:xshell连接不了虚拟机,出现错误提示:Connection closing...Socket close.Connection closed by foreign host.Disc ...

  9. Wireshark does not show SSL/TLS

    why it doesn't show as "TLS/SSL"? Because it's not on the standard port for SSL/TLS. You c ...

  10. Python使用selenium实现网页用户名 密码 验证码自动登录功能

    一.安装selenium 二.下载谷歌浏览器驱动 1.去http://chromedriver.storage.googleapis.com/index.html下载chromedriver.exe( ...