树与图的DFS与BFS
树的DFS
题目:https://www.acwing.com/problem/content/848/

代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=N*2;
int n;
int h[N],e[M],ne[M],idx;
bool st[N];
int ans=N; void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
} int dfs(int u)
{
int i,j;
//标记
st[u]=true;
//size表示当前子树的最大值
//sum表示其子树所有点之和
int size=0,sum=1;
for(i=h[u];i!=-1;i=ne[i])
{
j=e[i];
if(!st[j])
{
//获得其子树点和
int s=dfs(j);
//判断是否为最大
size=max(size,s);
//sum加上这个分支的总和
sum+=s;
}
}
//size比较其向上的其他点的最大值
size=max(n-sum,size);
//将当前最大值中去最小,即为我们所需答案
ans=min(ans,size);
return sum;
} int main()
{
//初始化
memset(h,-1,sizeof(h));
int i,j;
cin>>n;
for(i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
}
dfs(1);
cout<<ans<<endl;
return 0;
}
BFS
图中点的层次
题目:https://www.acwing.com/problem/content/849/
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=N*2;
int n,m;
int h[N],e[M],ne[M],idx;
int d[N]; void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
} int bfs()
{
int i,j;
queue<int>q;
//初始化距离全为-1,代表没有到该点
memset(d,-1,sizeof(d));
//将1加入
q.push(1);
//起点到起点距离为0
d[1]=0;
while(q.size())
{
int t=q.front();
q.pop();
//遍历点到其他点
for(i=h[t];i!=-1;i=ne[i])
{
j=e[i];
//j是否到达了
if(d[j]==-1)
{
//更新j的距离
d[j]=d[t]+1;
//将j加入队列
q.push(j);
}
}
}
//直到到n,若到不了那还是-1,到了就是d[n]
return d[n];
} int main()
{
int i,j;
cin>>n>>m;
memset(h,-1,sizeof(h));
while(m--)
{
int a,b;
cin>>a>>b;
//有向边
add(a,b);
}
cout<<bfs()<<endl;
return 0;
}
有向图的拓扑序列
题目:https://www.acwing.com/problem/content/850/
代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=1e5+10,M=N*2;
int h[N],e[M],ne[M],idx;
int q[N],d[N]; void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
} bool topsort()
{
//数组模拟队列
int hh=0,tt=-1;
int i,j;
//将入度为0的点入队
for(int i=1;i<=n;i++)
{
if(!d[i])
q[++tt]=i;
}
//遍历队列
while(hh<=tt)
{
//获取头
int t=q[hh++];
//遍历与头连接的边
for(i=h[t];i!=-1;i=ne[i])
{
j=e[i];
//去掉t-j的边,因此j的入度减1
d[j]--;
//如果j的入度为0,则加入到队列
if(d[j]==0)
q[++tt]=j;
}
}
//最后如果队尾=n-1代表,都加入到队列了
return tt==n-1;
} int main()
{
int i,j;
cin>>n>>m;
memset(h,-1,sizeof(h));
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b);
d[b]++;
}
if(topsort())
{
//数组存储的就是拓扑序列
for(i=0;i<n;i++)
cout<<q[i]<<" ";
}
else
cout<<"-1";
return 0;
}
树与图的DFS与BFS的更多相关文章
- 图的DFS和BFS(邻接表)
用C++实现图的DFS和BFS(邻接表) 概述 图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...
- 图的DFS与BFS
图的DFS与BFS(C++) 概述 大一学生,作为我的第一篇Blog,准备记录一下图的基本操作:图的创建与遍历.请大佬多多包涵勿喷. 图可以采用邻接表,邻接矩阵,十字链表等多种储存结构进行储存,这里为 ...
- Java数据结构——图的DFS和BFS
1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...
- [数据结构]图的DFS和BFS的两种实现方式
深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- 图的DFS与BFS遍历
一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...
- 树的常见算法&图的DFS和BFS
树及二叉树: 树:(数据结构中常见的树) 树的定义
- 图、dfs、bfs
graphdfsbfs 1.clone graph2.copy list with random pointer3.topological sorting4.permutations5.subsets ...
- 邻接矩阵实现图的存储,DFS,BFS遍历
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
随机推荐
- docker进入mysql数据库并进行导入 导出
一:导入 1.首先查看docker运行的容器: docker ps 2.将宿主机文件拷贝到docker容器中: docker cp 2020415.sql af491d5466ea:/opt/2020 ...
- java环境配置-win10(傻瓜式教程)
java环境配置 – 小学弟要开始学java了,由于本人较懒,表达能力有限,所以来这,写一篇简单的指导,帮学弟装下java环境. 首先打开浏览器,输入这个网址https://www.oracle.co ...
- 实现strStr
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- 怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中
怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中
- 【Linux】ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1548988705
------------------------------------------------------------------------------------------------- | ...
- 使用 gRPCurl 调试.NET 5的gPRC服务
介绍 你用过 Curl 吗?这个工具允许你通过 http 来发送数据,现在有一个适用于gGRPC的工具,gRPCurl,在本文中,我将介绍如何下载安装这个工具,然后通过这个工具调试我们.NET 5上面 ...
- kubectl工具管理应用
kubectl工具管理应用 创建一个pod [root@k8s-master ~]# kubectl run nginx --replicas=3 --labels="app=nginx-e ...
- ETCD数据迁移
ETCD数据迁移 本文阅读对象为想要将Rainbond平台rbd-etcd切换至外部etcd的相关人员. 在k8s master节点创建secret 本文中将要切换的ETCD为根据Rainbond官方 ...
- IDEA_2019.1版本中Protobuf的使用
一.Protobuf是什么 Protobuf 是 Google 发布的开源项目,全称 Google Protocol(/'prəʊtəkɒl/,协议,草案) Buffers,是一种轻便高效的结构化数据 ...
- ORM框架对比以及Mybatis配置文件详解
ORM框架对比以及Mybatis配置文件详解 0.数据库操作框架的历程 (1) JDBC JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句 ...