题目大意:给定一个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. uiviewcontroller顶级布局控制

    @available(iOS 7.0, *) open var edgesForExtendedLayout: UIRectEdge // Defaults to UIRectEdgeAll @ava ...

  2. swift 与 @objc

    Objective-C entry points https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-in ...

  3. <jsp:include page="${pageContext.request.contextPath/index.jsp" ></jsp:include> 引发的错误

    路径引发的错误 如下使用项目路径对jsp页面进行获取,会报javax.servlet.ServletException: File "/web/dbwx/web/public/page_to ...

  4. Flask框架 之数据库扩展Flask-SQLAlchemy

    一.安装扩展 pip install flask-sqlalchemy pip install flask-mysqldb 二.SQLAlchemy 常用的SQLAlchemy字段类型 类型名 pyt ...

  5. html引用ttf字体文件

    在样式表如此定义: @font-face { font-family: MyFontName;//自定义字体名称 src: url(../Gloss_And_Bloom.ttf) } 然后,具体使用: ...

  6. mac 目录颜色设置

    1 export CLICOLOR=1  2 export LSCOLORS=gxfxaxdxcxegedabagacad

  7. phphstrom改变项目中文件排列方式

    1.View>Tool Win dows>Project 效果图: 2.File->settings (Ctrl+Alt+S)-> Editor->General-> ...

  8. oracle获取排序后的第一条信息

    查询表table1里字段id小于10的所有数据,并且让数据根据id降序排列,然后得到第一条数据 select * from (select * from table1 where id<10 o ...

  9. 笔试算法题(52):简介 - KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)

    议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T ...

  10. jq ajax请求error: Maximum call stack size exceeded

    原因是data中参数iconUrl这个变量未声明导致的.jq在内部循环时报错