【BZOJ2208】[Jsoi2010]连通数 DFS

【BZOJ2208】[Jsoi2010]连通数

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。

题解:一开始以为要tarjan+DFS,后来发现为什么要tarjan~

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,cnt,ans,now;
int to[4000010],next[4000010],head[2010],vis[2010];
char str[2010];
void add(int a,int b)
{
	to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
	vis[x]=now,ans++;
	for(int i=head[x];i!=-1;i=next[i])	if(vis[to[i]]!=now)	dfs(to[i]);
}
int main()
{
	scanf("%d",&n);
	int i,j,u;
	memset(head,-1,sizeof(head));
	for(i=1;i<=n;i++)
	{
		scanf("%s",str);
		for(j=1;j<=n;j++)	if(str[j-1]=='1')	add(i,j);
	}
	for(i=1;i<=n;i++)	now++,dfs(i);
	printf("%d",ans);
	return 0;
}
posted @ 2017-05-19 14:49  CQzhangyu  阅读(293)  评论(0编辑  收藏  举报