2208: [Jsoi2010]连通数
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2758 Solved: 1201
[ Submit][ Status][ Discuss]
Description
Input
输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。
Output
输出一行一个整数,表示该图的连通数。
Sample Input
3
010
001
100
010
001
100
Sample Output
9
HINT
对于100%的数据,N不超过2000。
Source
题解: 这题听说要用 tarjan缩点+topo+bitset 吓得我打了一发暴力水过 留个坑以后补上
//这暴力都能ac,暴力踩标程不是浪得虚名QAQ
#include<bits/stdc++.h>
#define ll long long
const 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;
}