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;
}