BZOJ2208: [Jsoi2010]连通数

来源:互联网 发布:isis软件使用方法 编辑:程序博客网 时间:2024/05/16 18:13

2208: [Jsoi2010]连通数

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2758  Solved: 1201
[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]

HOME Back


题解: 这题听说要用 tarjan缩点+topo+bitset 吓得我打了一发暴力水过 留个坑以后补上

贴上代码

//这暴力都能ac,暴力踩标程不是浪得虚名QAQ #include<bits/stdc++.h>#define ll long longconst int INF = 0x7fffffff;const double eps = 1e-5;using namespace std;const int N = 2000 + 5; int read(){int x = 0 , f = 1; char ch = getchar();while(ch<'0'||ch>'9') {if(ch=='-')f*=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}return x * f;}struct Edge{int to,next;}e[N*N];int head[N],ans,T,cnt,vis[N];char c[N];void ins(int u,int v){e[++cnt].to = v; e[cnt].next = head[u]; head[u] = cnt;}void dfs(int u){vis[u] = T; ans++;for(int i = head[u];i;i=e[i].next){int v = e[i].to;if(vis[v]==T) continue;vis[v] = T; dfs(v);}}int main(){int n = read();for(int i = 1; i <= n ; i++){scanf("%s",c+1);for(int j = 1 ; j <= n ; j++)if(c[j]-'0') ins(i,j);}for(int i = 1; i <= n ; ++i){++T;dfs(i);}printf("%d",ans);return 0;}


原创粉丝点击