http://blog.csdn.net/u013598409/article/details/47037499 里面似乎有生成数据的。。。
//我本来的想法是tarjan缩点之后然后将图遍历一遍就可以了,复杂度应该是O(n2)的,为什么说这样是n3的啊。。。
//=>这种做法是错的因为有可能会重复计算用一下传递闭包就可以了然而直接递推以前写的dfsqaq
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define qwq(x) for(edge *o=head[x];o;o=o->next)
const int nmax=2e3+5;
const int maxn=nmax*nmax;
const int inf=0x7f7f7f7f;
struct edge{
int to;edge *next;
};
edge es[maxn],*pt=es,*head[nmax];
void add(int u,int v){
pt->to=v;pt->next=head[u];head[u]=pt++;
}
char ch[nmax];
int pre[nmax],scc_cnt,dfs_clock,sm[nmax],scc[nmax];
stack<int>s;
void mins(int &a,int b){
if(a>b) a=b;
}
int dfs(int x){
int lowu=pre[x]=++dfs_clock;s.push(x);
qwq(x){
if(!pre[o->to]) mins(lowu,dfs(o->to));
if(!scc[o->to]) mins(lowu,pre[o->to]);
}
if(lowu==pre[x]){
scc_cnt++;int o,cnt=0;
while(1){
o=s.top();s.pop();
scc[o]=scc_cnt;++cnt;
if(o==x) break;
}
sm[scc_cnt]=cnt;
}
return lowu;
}
bitset<nmax>a[nmax];
int in[nmax];vector<int>g[nmax];queue<int>q;
int main(){
int n,u,v,d;scanf("%d",&n);
rep(i,1,n){
scanf("%s",ch+1);
rep(j,1,n) if(ch[j]=='1') add(i,j);
}
rep(i,1,n) if(!pre[i]) dfs(i); rep(i,1,n) {
u=scc[i];
qwq(i) if(u!=(v=scc[o->to])) g[u].push_back(v),++in[v];
}
rep(i,1,scc_cnt) a[i][i]=1;
rep(i,1,scc_cnt) if(!in[i]) q.push(i);
while(!q.empty()){
u=q.front();q.pop();
if(!g[u].size()) continue;
rep(i,0,g[u].size()-1){
v=g[u][i];
a[v]|=a[u]; //a保存的是可以到达该强联通分量的
if(!--in[v]) q.push(v);
}
}
int ans=0;
rep(i,1,scc_cnt) rep(j,1,scc_cnt) if(a[i][j]) ans+=sm[i]*sm[j];
printf("%d\n",ans);
return 0;
}

2208: [Jsoi2010]连通数

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2249  Solved: 965
[Submit][Status][Discuss]

Description

Input

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

Output

输出一行一个整数,表示该图的连通数。

Sample Input

3
010
001
100

Sample Output

9

HINT

对于100%的数据,N不超过2000。

Source

[Submit][Status][Discuss]

bzoj2208:[Jsoi2010]连通数的更多相关文章

  1. [bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd

    连通数 bzoj-2208 Jsoi-2010 题目大意:给定一个n个节点的有向图,问每个节点可以到达的点的个数和. 注释:$1\le n\le 2000$. 想法:网上有好多tarjan+拓扑序dp ...

  2. bzoj2208 [Jsoi2010]连通数(scc+bitset)

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

  3. [BZOJ2208][Jsoi2010]连通数 暴力枚举

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

  4. BZOJ2208:[JSOI2010]连通数(DFS)

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

  5. BZOJ2208 [Jsoi2010]连通数 【图的遍历】

    题目 输入格式 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. 输出格式 输出一行一个整数,表示该图的连通数. 输入样例 3 ...

  6. [BZOJ2208]:[Jsoi2010]连通数(暴力 or bitset or 塔尖?)

    题目传送门 题目描述 度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对的个数. 在上图中,顶点1可以到达1.2.3.4.5. 顶点2可以到达2.3.4.5. 顶点3可以到达3.4.5. 顶点 ...

  7. BZOJ2208: [Jsoi2010]连通数

    tarjan缩点后拓扑排序,每一个点用一个bitset记录哪些点能到达它. PS:数据太水,暴力能过. #include<bits/stdc++.h> using namespace st ...

  8. BZOJ2208: [Jsoi2010]连通数(tarjan bitset floyd)

    题意 题目链接 Sol 数据水的一批,\(O(n^3)\)暴力可过 实际上只要bitset优化一下floyd复杂度就是对的了(\(O(\frac{n^3}{32})\)) 还可以缩点之后bitset维 ...

  9. 2018.09.11 bzoj2208: [Jsoi2010]连通数(bitset+floyd)

    传送门 听说正解是缩点+dfs? 直接bitset优化floyd传递闭包就行了.(尽管时间复杂度是假的O(n3/32)" role="presentation" styl ...

  10. 【强联通分量缩点】【搜索】bzoj2208 [Jsoi2010]连通数

    两次dfs缩点,然后n次dfs暴搜. #include<cstdio> #include<vector> #include<cstring> using names ...

随机推荐

  1. java----线程篇

    一个线程是进程内的一个单一的顺序控制流程图,多线程是指一个进程可以同时运行几个任务,每个任务由一个线程来完成.即多个线程可以同时运行,并且在一个进程内执行不同的任务. 1.创建线程两种方法方法一, 继 ...

  2. Opencv Mat的操作

    cout << mat 有错误的原因 You are using OpenCV built with VS10. The ostream operator << in the ...

  3. Sqoop 1.99.4 安装

    1.安装准备工作:已经装好的 hadoop 环境是 hadoop-2.5.1 64位下载的sqoop安装包(注意是hadoop200)http://www.us.apache.org/dist/sqo ...

  4. svn团队环境

    1.安装VisualSVN Server VisualSVN-Server-3.3.1-x64.msi 下载,并安装标准版(免费) 2.下载TortoiseSVN TortoiseSVN-1.8.11 ...

  5. Python的注释

    任何时候,我们都可以给程序加上注释.注释是用来说明代码的,给自己或别人看,而程序运行的时候,Python解释器会直接忽略掉注释,所以,有没有注释不影响程序的执行结果,但是影响到别人能不能看懂你的代码. ...

  6. execution 表达式

    execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) th ...

  7. response 返回 带双引号 的字符串解决办法 springmvc

    springmvc json配置 返回的时候给你加上了

  8. 100 doors

    Question There are 100 doors in a row that are all initially closed. You make 100 passes by the door ...

  9. 基于注解风格的Spring-MVC的拦截器

    基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...

  10. sql之left join、right join、inner join的区别(转)

    感谢:http://www.cnblogs.com/pcjim/articles/799302.html ----------------------------------------------- ...