树的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. 【JavaWeb】Servlet 程序

    Servlet 程序 Servlet Servlet 是在 Web 服务器中运行的小型 Java 程序.Servlet 通常通过 HTTP(超文本传输​​协议)接收和响应来自 Web 客户端的请求. ...

  2. 利用css和jquery制成弹幕

    1.首先上图看下效果 2.废话不多说,直接上代码 1>html代码 <div class="barrage"> <div class="scree ...

  3. LeetCode349. 两个数组的交集

    题目 给定两个数组,编写一个函数来计算它们的交集. 分析 数组元素值可以很大,所以不适合直接开数组进行哈希,这里要学习另一种哈希方式:集合 集合有三种,区别见下面代码随想录的Carl大佬的表格,总结的 ...

  4. 一. SpringCloud简介与微服务架构

    1. 微服务架构 1.1 微服务架构理解 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在 ...

  5. 5.2 Spring5源码--Spring AOP源码分析二

    目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...

  6. +load和+initialize方法调用时机

    一.+load方法什么时候调用 +load方法会在runtime加载类.分类时调用(程序运行起来会先去加载调用+load 跟你引用没有引用其头文件没有关系).每个类.分类的+load,在程序运行过程中 ...

  7. BINARY SEARCH 的一点说明

    在sap 之abap语言中,有‍BINARY SEARCH这个查找条件.使用read table 来读取内表时,使用‍BINARY SEARCH可以大大的提高查找的效率,为什么呢?学过数据库的人会知道 ...

  8. 零基础怎么学Python编程,新手常犯哪些错误?

    Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...

  9. Py装饰器

    装饰器: 1.定义,什么是装饰器 装饰器本质是一个函数,它是为了给其他函数添加附加功能 2.装饰器的两个原则 原则1   不修改被修饰函数的源代码原则2   不修改被修饰函数的调用方式 3.首先来看一 ...

  10. 同步与异步 Python 有何不同?

    你是否听到人们说过,异步 Python 代码比"普通(或同步)Python 代码更快?果真是那样吗? 1 "同步"和"异步"是什么意思? Web 应用 ...