关于dfs

dfs伪代码:

void dfs(s){
for(int i=0;i<s的出度;i++){
if(used[i]为真) continue;
used[i]=1;
dfs(i);
}
return;
}

统计无向图的连通分量

显然,你在洛谷上是搜不到这题的,因为这是我们学校团队的题。所以还是找个小板凳专心听我讲吧。

题目描述:

给定无向图G(V,E),请统计G中连通分量的数量。

  • 连通分量:结点V的一个子集V',保证V'中任意两点间都有路径
  • 需要在主循环中进行多次dfs

输入输出格式:

输入格式:

第一行包含两个整数N、M,表示该图共有N个结点和M条无向边(N<= 5000,M<=200000);

接下来M行,每行包含2个整数{u,v},表示有一条无向边(u,v)。

输出格式:

一个整数,代表图G连通分量的数量

样例:

输入:

5 4
1 5
2 3
3 4
4 2

输出:

2

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int NR=5005;
bool color[NR];//used数组
int cnt=0,n,m;
vector<int> link[NR];
void dfs(int a){//dfs函数
int sz=link[a].size();
for(int i=0;i<sz;i++){
int nx=link[a][i];
if(color[nx]==false){
color[nx]=true;
dfs(nx);
}
}
return;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int st,en;
scanf("%d%d",&st,&en);
link[st].push_back(en);
link[en].push_back(st);
}
for(int i=1;i<=n;i++){//对于每个没有去过的点,将其所有可以到达的点标为true,计数加一,重复
if(color[i])continue;
color[i]=true;
dfs(i);
cnt++;
}
cout<<cnt;
return 0;
}

最新文章

  1. TSQL语句练习题
  2. 弹性盒子布局flexbox
  3. mysql 注释
  4. Android 线程的正确使用姿势
  5. php: 学习记录
  6. 解决maven依赖传递中的版本冲突问题
  7. NodeJS中form上传附件中针对表单的multiple attribute出现的问题总结
  8. 在keil 4中添加stc系列芯片的方法--【sky原创】
  9. 第六章_PHP数组(二)
  10. xceed wpf datagrid
  11. [转]Activemq管理和基本介绍
  12. Scala入门指南与建议
  13. sql,nosql
  14. 关于ListView中convertView的缓存个数的探究
  15. Java 注解 入门
  16. jquery.uploadifive 解决上传限制图片或文件大小
  17. JAVA中的Buffer
  18. python day1 基本语法作业
  19. flex.css
  20. LogStash如何通过jdbc 从mysql导入elasticsearch

热门文章

  1. springboot2.1.3使用jdbcTemplate
  2. Java8 stream用法-备忘录
  3. USB Accessory 模式
  4. HDFS重启集群导致数据损坏,使用fsck命令修复过程
  5. 转载-企业环境下MySQL5.5调优
  6. 搭建React项目环境【1】
  7. Schema学习【一】
  8. linux系统编程之信号(五)
  9. linux系统编程之文件与io(五)
  10. 正确robots写法,解决百度搜索不显示缩略图问题