树的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的更多相关文章

  1. 图的DFS和BFS(邻接表)

    用C++实现图的DFS和BFS(邻接表) 概述   图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...

  2. 图的DFS与BFS

    图的DFS与BFS(C++) 概述 大一学生,作为我的第一篇Blog,准备记录一下图的基本操作:图的创建与遍历.请大佬多多包涵勿喷. 图可以采用邻接表,邻接矩阵,十字链表等多种储存结构进行储存,这里为 ...

  3. Java数据结构——图的DFS和BFS

    1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...

  4. [数据结构]图的DFS和BFS的两种实现方式

    深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...

  5. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  6. 图的DFS与BFS遍历

    一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...

  7. 树的常见算法&图的DFS和BFS

    树及二叉树: 树:(数据结构中常见的树) 树的定义

  8. 图、dfs、bfs

    graphdfsbfs 1.clone graph2.copy list with random pointer3.topological sorting4.permutations5.subsets ...

  9. 邻接矩阵实现图的存储,DFS,BFS遍历

    图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...

随机推荐

  1. 如何将项目推到github上面

    1.先查看是否安装git. 2.如果没有安装git ,下载之后别忘了配置环境变量.(右击此电脑 --属性--高级系统设置--环境变量--系统变量中的path) 3.推代码 查看状态(可查可不查) gi ...

  2. 微信小程序项目转换为uni-app项目

    一.它是谁? [miniprogram-to-uniapp]转换微信小程序"项目为uni-app项目.原则上混淆过的项目,也可以进转换,因为关键字丢失,不一定会完美. 二.它的原理是什么? ...

  3. 【Flutter】容器类组件之Container容器

    前言 Container是一个组合类容器,它本身不对应具体的RenderObject,它是DecoratedBox.ConstrainedBox.Transform.Padding.Align等组件组 ...

  4. 第一章计算机网络概述---OSI七层网络模型

    局域网和广域网 局域网的简写是LAN,广域网用WAL表示.其实家庭的网络就是一个小型的局域网,一个光猫,一根网线,但是光猫无线信号不太好的话,需要在搞一个路由器. 这时候你的电脑连接到路由器上,路由器 ...

  5. Deep Learn I'm back.

    Intorduction: 时隔好几个月,我准备重新进入Deep Learning 的领域.昨天和老师聊了很多,之前觉得我做的工作就是排列组合,在水论文,灌水.但老师却说:这也是为将来的研究打基础. ...

  6. 【MySQL】SELECT语句 - 查询数据

    第4章 检索数据 文章目录 第4章 检索数据 1.SELECT语句 2.检索单个列 3.检索多个列 4.检索所有列 5.检索不同的行 6.限制结果 7.使用完全限定的表名 8.小结 简单记录 - My ...

  7. explain extended;show warnings

    mysql> explain extended select count(*) from xuehao;+----+-------------+-------+------+---------- ...

  8. 【Linux】saltstack 安装及简单使用

    准备三台server,一台为master(10.96.20.113),另两台为minion(10.96.20.117,10.96.20.118) 主机名(master.minion1.minion2) ...

  9. web测试误区:浏览器后退键退出系统会话失效

    通过最近测试的项目,认识到实际:浏览器后退键退出系统,会话仍旧有效.打破了之前认为浏览器后退键就会退出系统登录的认知. 一,了解Cookie和Session的作用,具体来说cookie机制采用的是在客 ...

  10. expect的使用

    1. expect概述 1.1 expect的功能 脚本执行时,有时会需要人工进行交互输入,这时可以通过expect工具来实现自动交互. expect是一种shell解释器,但是expect可以在命令 ...