[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。

题目分析:

直接dfs即可 但是直接memset会TLE 那么就要用到时间戳代替bool
竟然还被边的条数坑了一波RE

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int vis[3000],head[3000],to[4000010],net[4000010];
int tot,ans;
void add(int x,int y)
{
	net[++tot]=head[x];
	to[tot]=y;
	head[x]=tot;
}
int n;
char s[3000];
int now;
void dfs(int x)
{
	vis[x]=now;
	ans++;
	for(int i=head[x];i;i=net[i]) 
		if(vis[to[i]]!=now) dfs(to[i]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",&s[0]);
		for(int j=0;j<n;j++)
			if(s[j]=='1') add(i,j+1);
	}
	for(int i=1;i<=n;i++) now++,dfs(i);
	printf("%d",ans);	
    return 0;
}

 

发表评论

邮箱地址不会被公开。 必填项已用*标注