输入一个无向图,求图中连通块的个数。
输入格式
输入第一行两个整数 n,m(1 \le n, m \le 20000)n,m(1≤n,m≤20000),表示图的点的数量和边的数量,两数之间以一个空格分隔。
接下来 mm 行,每行两个整数 a, b (1 \le a, b \le n)a,b(1≤a,b≤n),表示一条无向边,两数之间以一个空格分隔。
输出格式
输入一行一个整数,表示图中连通块的个数。
#include<stdio.h>
#include<string.h>
int vis[100000];
struct edge{
int v,next;
}e[100000];
int p[100000],eid;
void insert(int x,int y) {
e[eid].v=y;
e[eid].next=p[x];
p[x]=eid++;
}
void insert2(int x,int y) {
insert(x,y);
insert(y,x);
}
void dfs(int u) {
vis[u]=1;
for (int i=p[u];~i;i=e[i].next) {
int v=e[i].v;
if(!vis[v]) {
dfs(v);
}
}
}
int main() {
memset(p,-1,sizeof(p));
int n,m;
int ans=0;
scanf("%d %d",&n,&m);
for (int i=0;i<m;i++) {
int u,v;
scanf("%d %d",&u,&v);
if(u!=v)
insert2(u,v);
}
for (int i=1;i<=n;i++) {
if(!vis[i]) {
ans++;
dfs(i);
}
}
printf("%d",ans);
}