acwing 图的深度搜索DFS

写目录

    • 邻接表的构建
    • 邻接表DFS
    • AcWing 846. 树的重心
      • 无向图
    • pat 1034 Head of a Gang
      • 有向图的深度搜索,各连通块分别搜索

邻接表的构建

在这里插入图片描述

邻接表DFS

const int N = 1e5 + 10, M = 2*N;
int h[N], e[M], ne[M];          // h[N]: 顶点Ni的第一个连接点
bool visited[M];                // 某一连接点是否已被搜索
int n = 0, idx = 0;

void add(int a, int b)  // 添加一条边a->b
{
    e[idx] = b;     // 创建相连点b
    ne[idx] = h[a]; // 该相连点b的下一点是当前顶点a的第一个连接点
    h[a] = idx++;   // 更新顶点a的第一个连接点
}
void dfs(int u)
{
    cout << u << " ";
    visited[u] = true;
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if(!visited[j])
            dfs(j);
    }
}

int main()
{
    memset(h,-1,sizeof h);          // 将h置为-1,表示初始时
    cin >> n;                       // 所有顶点都没有连接点
    int a, b;
    for(int i = 0; i < n - 1; ++i) // n - 1条无向边
    {
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }
    dfs(1);
    return 0;
}

AcWing 846. 树的重心

无向图

  • 主要找删除某个顶点后各连通块中点个数量的关系
  • 连通点数是个数
const int N = 1e5 + 10, M = 2*N;
int h[N], e[M], ne[M];          // h[N]: 顶点Ni的第一个连接点
bool visited[M];                // 某一连接点是否已被搜索
int n = 0, idx = 0;

void add(int a, int b)  // 添加一条边a->b
{
    e[idx] = b;     // 创建相连点b
    ne[idx] = h[a]; // 该相连点b的下一点是当前顶点a的第一个连接点
    h[a] = idx++;   // 更新顶点a的第一个连接点
}

int ans = N;

int dfs(int u)
{
    visited[u] = true;
    
    int sum = 1; // 当前顶点的所有连接点个数(包含当前顶点)
    int ret = 0; // 当前顶点各支路的连接点个数的最大值
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if(!visited[j])
        {
            int tmp = dfs(j);
            ret = max(ret, tmp);
            sum += tmp;
        }
    }
    ret = max(ret, n - sum); // 因为sum包含当前顶点,所以不用-1
    ans = min(ans, ret);
    return sum;
}

int main()
{
    memset(h,-1,sizeof h);          // 将h置为-1,表示初始时
    cin >> n;                       // 所有顶点都没有连接点
    int a, b;
    for(int i = 0; i < n - 1; ++i) // n - 1条无向边
    {
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }
    
    dfs(1);
    cout << ans;
    return 0;
}

pat 1034 Head of a Gang

有向图的深度搜索,各连通块分别搜索

  • 各连通块即各帮派
const int N = 2*(1e3 + 10);
unordered_map<string, int> index;
unordered_map<int, string> index_name;
vector<int> each_time(N);
vector<Node> calls[N];
vector<Node> ret;
bool visited[N];
int n, m, idx = 0;
vector<string> start;
struct Node
{
    Node(){}
    Node(string n, int t):name(n), time(t){}
    string name;
    int time;
};
// 在一个连通块内进行的深度搜索
void dfs(int u, int &nsum, int &tsum, int &head)
{
    visited[u] = true;
    if(each_time[u] > each_time[head])        // 更新头目
        head = u;
    for(int i = 0; i < calls[u].size(); ++i)
    {
        int j = index[calls[u][i].name];
        tsum += calls[u][i].time;            // 累加连通块内总通话时长
        if(!visited[j])
        {
            nsum += 1;    // 连通块内成员数,这里需区分是否已经搜索
            dfs(j, nsum, tsum, head);
        }
    }
}

// 检测s是否曾出现过,并设置编号
bool check_in(string s, int &ci)
{
    if(index.count(s))
        ci = index[s];
    else
    {
        ci = idx;
        index_name[ci] = s;
        index[s] = idx++;
    }
}

void add(string s1, string s2, int t)
{
    Node m_node;
    m_node.time = t;
    m_node.name = s2;
    int i1 = 0, i2 = 0;
    check_in(s1, i1);
    check_in(s2, i2);
    calls[i1].push_back(m_node);
    // 为通话双方都加上通话时间
    // 方便后续得到某个成员的总通话时长
    each_time[i1] += t;
    each_time[i2] += t;
}
bool cmp(Node n1, Node n2)
{
    return n1.name < n2.name;
}
int main()
{
    cin >> n >> m;
    string s1, s2;
    int t;
    for(int i = 0; i < n; i++)
    {
        cin >> s1 >> s2 >> t;
        // 如果s1 s2都未出现,则为新的连通块
        if(!index.count(s1) && !index.count(s2))
            start.push_back(s1);
        // 插入邻接表
        add(s1, s2, t);
    }
    for(auto &s : start)
    {
        int head = index[s];
        int tsum = 0, nsum = 1;
        dfs(head, nsum, tsum, head);
        if(tsum > m && nsum > 2)
            ret.push_back({index_name[head], nsum});
    }
    sort(ret.begin(), ret.end(), cmp);    // 姓名字典序排序
    cout << ret.size();
    for(auto &p : ret)
        cout << endl << p.name << " " << p.time;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/327313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习周报第27周

目录 摘要Abstract一、文献阅读 摘要 本周阅读了一篇混沌时间序列预测的论文&#xff0c;论文模型主要使用的是时间卷积网络&#xff08;Temporal Convolutional Network&#xff0c;TCN&#xff09;、LSTM以及GRU。在数据集方面除了使用现实的时间序列数据外&#xff0c;还通…

接口防刷方案

1、前言 本文为描述通过Interceptor以及Redis实现接口访问防刷Demo 2、原理 通过ip地址uri拼接用以作为访问者访问接口区分 通过在Interceptor中拦截请求&#xff0c;从Redis中统计用户访问接口次数从而达到接口防刷目的 如下图所示 3、案例工程 项目地址&#xff1a; htt…

MongoDB Compass当前版本及历史版本下载安装

mongoDB compass 当前版本下载 官网 https://www.mongodb.com/try/download/compass 官网下载一般只能下载最新版本。 github https://github.com/mongodb-js/compass MongoDB Compass与MongoDB的版本对应关系 MongoDB CompassMongoDB1.9.12MongoDB 2.6.11 Community

STM32H5 Nucleo-144 board开箱

文章目录 开发板资料下载 【目标】 点亮LD1&#xff08;绿&#xff09;、LD2&#xff08;黄&#xff09;和LD3&#xff08;红&#xff09;三个LED灯 【开箱过程】 博主使用的是STM32CubeMX配置生成代码&#xff0c;具体操作如下&#xff1a; 打开STM32CubeMX&#xff0c;File-…

快速知识付费平台搭建,一分钟搭建你的专属知识服务平台

产品服务 线上线下课程传播 线上线下活动管理 项目撮合交易 找商机找合作 一对一线下交流 企业文化宣传 企业产品销售 更多服务 实时行业资讯 动态学习交流 分销代理推广 独立知识店铺 覆盖全行业 个人IP打造 独立小程序 私域运营解决方案 公域引流 营销转化 …

vue前端开发自学,使用yarn脚手架创建vue项目

vue前端开发自学,使用yarn脚手架创建vue项目&#xff01;下面展示一下&#xff0c;如何在本机操作&#xff0c;使用yarn这款脚手架&#xff0c;创建一个vue项目。 第一步&#xff0c;你需要先创建好&#xff0c;即将存档项目的文件夹。我的路径是在&#xff1a;"D:\yarn\…

C++ OJ基础

C OJ基础 在学校学习C程序设计基础课程的OJ题目 缺少第二十题 这里写目录标题 C OJ基础习题练习(一)打印图形习题练习(二)数据的输入输出习题练习(三)函数重载习题练习(四)设计矩形类习题练习(五)定义Tree类习题练习(六)完善职工工资类Salary的设计习题练习(七)设计矩形类recta…

2、BERT:自然语言处理的变革者

请参考之前写的&#xff1a;2、什么是BERT&#xff1f;-CSDN博客文章浏览阅读826次&#xff0c;点赞19次&#xff0c;收藏22次。BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是Google在2018年提出的一种自然语言处理&#xff08;NLP&…

直流电机闭环调速实验

直流电机闭环调速实验 直流电机闭环调速系统是一个典型的按偏差调节的闭环控制系统&#xff0c;通过系统的调节&#xff0c;使电机的转速与期望的给定速度一致。 本次实验我们就以AEDK-LabACT 自控/计控原理实验箱中的直流电机为对象&#xff0c;分析讨论直流电机闭环调速系统设…

java日志框架总结

一、日志框架简单分类介绍 java常用的日志框架、可以分为两组&#xff1a; 1、JCL、JUL、Log4j&#xff1b; 2、SLF4J、Log4j2、Logback&#xff1b; 其中第一组是比较早期的日志实现框架&#xff0c;JCL并不是具体的日志实现框架&#xff0c;JCL其实是定义了一…

cad的模型怎么打散导入3d---模大狮模型网

将CAD中的模型打散并导入3D建模软件&#xff0c;需要以下步骤&#xff1a; 将CAD中的模型进行分组或分层&#xff1a;在CAD中&#xff0c;将模型按照不同的组或层进行分组或分层。这样可以方便地控制每个部分的显示和隐藏&#xff0c;在导入3D建模软件后&#xff0c;也可以更方…

运维知识点-Sqlite

Sqlite 引入 依赖 引入 依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.36.0.3</version></dependency>import javafx.scene.control.Alert; import java.sql.*;public clas…

【FastAPI】请求体

在 FastAPI 中&#xff0c;请求体&#xff08;Request Body&#xff09;是通过请求发送的数据&#xff0c;通常用于传递客户端提交的信息。FastAPI 使得处理请求体变得非常容易。 请求体是客户端发送给 API 的数据。响应体是 API 发送给客户端的数据 注&#xff1a;不能使用 …

通过 C++/WinRT 使用 API

如果 API 位于 Windows 命名空间中 这是你使用 Windows 运行时 API 最常见的情况。 对于元数据中定义的 Windows 命名空间中的每个类型&#xff0c;C/WinRT 都定义了 C 友好等效项&#xff08;称为投影类型 &#xff09;。 投影类型具有与 Windows 类型相同的完全限定名称&…

报名活动怎么做_小程序创建线上报名活动最详细攻略

报名活动怎么做&#xff1a;一篇让你掌握活动策划与营销的秘籍 在当今社会&#xff0c;无论是线上还是线下&#xff0c;活动已经成为企业营销和品牌推广的重要手段。但是&#xff0c;如何策划一场成功的活动呢&#xff1f;这篇文章将为你揭示活动策划与营销的秘籍&#xff0c;…

Python代码调试的几种方法总结

使用 pdb 进行调试 pdb 是 python 自带的一个包&#xff0c;为 python 程序提供了一种交互的源代码调试功能&#xff0c;主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令&#xff0c;详情见表 1。…

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf 症状 Visual Studio调试模式下&#xff0c;程序停在断点时&#xff0c;我临时需要将ppt转为pdf&#xff0c;遂右键单击文件&#xff0c;想直接转pdf&#xff0c;奈何光标转了几秒钟&#xff0c;毫无反应。 解决方法 …

Java生成四位数随机验证码

引言&#xff1a; 我们生活中登录的时候都要输入验证码&#xff0c;这些验证码是为了增加注册或者登录难度&#xff0c;减少被人用脚本疯狂登录注册导致的一系列危害&#xff0c;减少数据库的一些压力。 毕竟那些用脚本生成的账号都是垃圾账号 本次实践&#xff1a;生成这样的…

Java基础知识整理,注释、关键字、运算符

写在开头 万丈高楼平地起&#xff0c;要想学好汉语首先学拼音&#xff0c;想学好英语首先学26个字母&#xff0c;对于编程语言来说&#xff0c;一样的道理&#xff0c;要想学好必须先掌握其基础语法和知识&#xff0c;今天我们就来唠一唠Java语言中那些出现频率极高&#xff0…

JVM基础(4)——JVM存活判定算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…