1:DFS
#define N 10000 //图中点的个数
int graph[N][N];// 0 表示没有边 1 表示有边
bool visited[N]={false};
void DFS(int root){
visited[root]=true;
for(int i=0;i<N;i++){
if(visited[i]==false&&graph[root][i]!=0){
DFS(i);
}
}
}
int count(int node){
int cnt=0;
for(int i=0;i<N;i++){
if(visited[i]==false){
DFS(i);
cnt++;
}
}
return cnt;
}
思路:一次深搜能访问一个节点所有能访问的边,统计有几次DFS就能表示有几个变量了。
2:并查集
#define N 10000 //图中点的个数
int father[N];
int findFather(int v){
int m=v;
while(v!=father[v]){
v=father[v];
}
while(m!=father[m]){
int temp=father[m];
father[m]=v;
m=temp;
}
}
void union(int a,int b){
int Fa=findfather(a);
int Fb=findfather(b);
if(Fa!=Fb){
father[Fa]=Fb;
}
}
int cout(){
int cnt=0;
for(int i=0;i<N;i++){
if(father[i]==i){
cnt++;
}
}
return cnt;
}
将能相互连通的点的集合赋予一个共同的父亲,统计父亲的个数就行了。