#include<cstdio>
#include<vector>
const int MAX=1000000;
const int INF=1000000000;
using namespace std;
vector<int>Adj[MAX];
int n;//顶点数 ,记录
bool vis[MAX]={false};
int max(int a,int b){
if(a>b)return a;
else return b;
}
void DFS(int u,int depth){
vis[u]=true;
for(int i=0;i<Adj[u].size();i++){//枚举U相连接 //注意后面还有一个
int v=Adj[u][i];
if(vis[v]==false){//i只是顺序,v才是结点值
DFS(v,depth+1);
}
}
}
int DFSTrave(){
int count=0;
for(int i=1;i<=n;i++){
if(vis[i]==false&&Adj[i].size()>0){//必须保证该结点存入边
DFS(i,1);
count++;
}
}
return count;
}
int main(){
int a,b;
n=0;
while(scanf("%d%d",&a,&b)!=EOF){
Adj[a].push_back(b);
Adj[b].push_back(a);//无向图
n=max(n,max(a,b));//动态更新结点数
}
printf("%d\n",DFSTrave());
return 0;
}
算法笔记10.3图遍历第一题
最新推荐文章于 2024-09-28 18:08:30 发布