BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序
题目大意:给定一个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+拓扑排序的更多相关文章
- BZOJ 2208: [Jsoi2010]连通数 tarjan bitset
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2208: [Jsoi2010]连通数( DFS )
n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...
- bzoj 2208 [Jsoi2010]连通数
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...
- BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)
题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...
- bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】
我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...
- 2208: [Jsoi2010]连通数 - BZOJ
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图 ...
- 【BZOJ】2208 [Jsoi2010]连通数
[题意]给定n个点的有向图,求可达点对数(互相可达算两对,含自身).n<=2000. [算法]强连通分量(tarjan)+拓扑排序+状态压缩(bitset) [题解]这题可以说非常经典了. 1. ...
- 2208: [Jsoi2010]连通数
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1371 Solved: 557[Submit][Status ...
- 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp
题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...
随机推荐
- uiviewcontroller顶级布局控制
@available(iOS 7.0, *) open var edgesForExtendedLayout: UIRectEdge // Defaults to UIRectEdgeAll @ava ...
- swift 与 @objc
Objective-C entry points https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-in ...
- <jsp:include page="${pageContext.request.contextPath/index.jsp" ></jsp:include> 引发的错误
路径引发的错误 如下使用项目路径对jsp页面进行获取,会报javax.servlet.ServletException: File "/web/dbwx/web/public/page_to ...
- Flask框架 之数据库扩展Flask-SQLAlchemy
一.安装扩展 pip install flask-sqlalchemy pip install flask-mysqldb 二.SQLAlchemy 常用的SQLAlchemy字段类型 类型名 pyt ...
- html引用ttf字体文件
在样式表如此定义: @font-face { font-family: MyFontName;//自定义字体名称 src: url(../Gloss_And_Bloom.ttf) } 然后,具体使用: ...
- mac 目录颜色设置
1 export CLICOLOR=1 2 export LSCOLORS=gxfxaxdxcxegedabagacad
- phphstrom改变项目中文件排列方式
1.View>Tool Win dows>Project 效果图: 2.File->settings (Ctrl+Alt+S)-> Editor->General-> ...
- oracle获取排序后的第一条信息
查询表table1里字段id小于10的所有数据,并且让数据根据id降序排列,然后得到第一条数据 select * from (select * from table1 where id<10 o ...
- 笔试算法题(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 ...
- jq ajax请求error: Maximum call stack size exceeded
原因是data中参数iconUrl这个变量未声明导致的.jq在内部循环时报错