法1° DFS+邻接表
#include<iostream>
#include<vector>
using namespace std;
const int MAXV=1000010;//最大顶点数
vector<int>Adj[MAXV];//邻接表
int n;//顶点数
bool vis[MAXV];//如果顶点i已被访问,则vis[i]==true
bool Hash[MAXV];//增加一个Hash来判断该图包含哪些点
void DFS(int u,int depth){//u为当前访问的顶点标号,depth为深度
vis[u]=true;//设置u已被访问
for(int i=0;i<Adj[u].size();++i){//对从u出发可以到达的所有顶点v
int v=Adj[u][i];
if(!vis[v]) DFS(v,depth+1);//如果v未被访问,访问v,深度+1
}
}
int DFSTrave(){//遍历该图
int ans=0;
for(int u=0; u<=n; ++u){//对每个顶点u
if(Hash[u] && !vis[u]){//如果u未被访问
DFS(u,1);//访问u和u所在的连通块,1表示初始为第一层
++ans;//连通块数+1
}
}
printf("%d\n",ans);
}
int main() {
int x,y;
while(~scanf("%d%d",&x,&y)){
if(x>n) n=x;
if(y>n) n=y;
Adj[x].push_back(y);
Adj[y].push_back(x);
Hash[x]=Hash[y]=true;
}
DFSTrave();
return 0;
}
注:DFS可以不用加depth这个参数。