DFS的一些题目

news2024/11/24 20:33:56

题目1:奶牛选美

这道题其实就是把两个连通块合成一个,可以用dfs、bfs和并查集。因为最近在dfs专题训练,这里我只写了dfs。

首先我们用dfs的方式遍历两个连通块,将两个连通块中点的坐标分别存入两个数组中,将这两个数组中的点一 一匹配,迭代出最小值。

#include<iostream>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
vector<PII> points[2];
const int N=55;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int n,m;
char g[N][N];
void dfs(int x,int y,vector<PII> &q)
{
    q.push_back({x,y});
    g[x][y]='.';
    for(int i=0;i<4;i++)
    {
        int cx=x+dx[i],cy=y+dy[i];
        if(cx<0||cx>=n||cy<0||cy>=m) continue;
        if(g[cx][cy]=='X') dfs(cx,cy,q);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) scanf("%s",g[i]);
    int k=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(g[i][j]=='X') dfs(i,j,points[k++]);
        }
    int res=N*N;
    
    for(int i=0;i<points[0].size();i++)
        for(int j=0;j<points[1].size();j++)
        {
            int x1=points[0][i].x,y1=points[0][i].y;
            int x2=points[1][j].x,y2=points[1][j].y;
            int t=abs(x1-x2)+abs(y1-y2)-1;
            res=min(res,t);
        }
    printf("%d",res);
}

题目2:大臣的旅费

首先是最暴力的写法。

以每个点为起点,搜索它的最长路径,最后取所有点为起点时最长路径的最大值。

时间复杂度是O(n^{2})。

#include<iostream>
#include<cstring>
using namespace std;
const int N=2e5+10;
int h[N],e[N],ne[N],w[N],idx=0;
int n;
bool st[N];
int sum=0;
void add(int p,int q,int d)
{
    e[idx]=q;
    w[idx]=d;
    ne[idx]=h[p];
    h[p]=idx++;
}
int dfs(int u,int res)
{
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(st[j]) continue;
        st[j]=1;
        sum=max(sum,dfs(j,res+w[i]));
        st[j]=0;
    }
    return res;
}
int main()
{
    scanf("%d",&n);
    memset(h,-1,sizeof(h));
    for(int i=1;i<n;i++) 
    {
        int p,q,d;
        scanf("%d%d%d",&p,&q,&d);
        add(p,q,d);
        add(q,p,d);
    }
    int res=0;
    
    for(int i=1;i<=n;i++) 
    {
        memset(st,0,sizeof(st));
        st[i]=1;
        dfs(i,0);
    }
    printf("%d",((10+1)+(10+sum))*sum/2);
}

接下来考虑该如何优化。

这其实涉及到一个知识点——求树的直径。这个问题有固定的步骤:

①选定一个x,求出x到所有点的距离;

②找到与x距离最远的点y,求出y到所有点的距离;

③y到所有点的最长距离即为答案。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int h[N],e[N],ne[N],w[N],idx=0;
int n;
bool st[N];
int dist[N];
void add(int p,int q,int d)
{
    e[idx]=q;
    w[idx]=d;
    ne[idx]=h[p];
    h[p]=idx++;
}
void dfs(int u,int di)
{
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(dist[j]!=-1) continue;
        dist[j]=di+w[i];
        dfs(j,dist[j]);
    }
}
int main()
{
    scanf("%d",&n);
    memset(h,-1,sizeof(h));
    for(int i=1;i<n;i++) 
    {
        int p,q,d;
        scanf("%d%d%d",&p,&q,&d);
        add(p,q,d);
        add(q,p,d);
    }
    memset(dist,-1,sizeof(dist));
    dist[1]=0;
    dfs(1,0);
    int maxpoint=0,maxval=0;
    for(int i=1;i<=n;i++)
        if(dist[i]>maxval)
        {
            maxval=dist[i];
            maxpoint=i;
        }
    memset(dist,-1,sizeof(dist));
    dist[maxpoint]=0;
    dfs(maxpoint,0);
    sort(dist+1,dist+1+n);
    int res=dist[n];
    printf("%lld",(long long)(10+1+10+res)*res/2);
    
}

题目3:扫雷

这道题的过程是:遍历排雷火箭,如果排雷火箭的范围(遍历-r到r之间在圆内的所有点)波及到了炸弹,则炸弹爆炸,dfs炸弹的范围。

这道题过完所有数据需要手写哈希,这里没有手写,过了8/11个数据。

#include<iostream>
#include<unordered_map>
using namespace std;
const int N=5e4+10,M=1e9+1;
typedef pair<int,int> PII;
typedef long long ll;
#define x first
#define y second
int n,m;
pair<PII,int> jian[N],lei[N];
unordered_map<ll,int> is_lei;
unordered_map<ll,int> num;
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
int cnt=0;
void dfs(int x,int y,int r)
{
    for(int cx=max(0,x-r);cx<=x+r;cx++)
        for(int cy=max(0,y-r);cy<=y+r;cy++)
        {
            if((cx-x)*(cx-x)+(cy-y)*(cy-y)>r*r) continue; 
            ll t;
            t=cx*M+cy;
            
            if(is_lei.count(t)) 
            {
                cnt+=num[t];
                int tr=is_lei[t];
                is_lei.erase(t);
                num.erase(t);
                dfs(cx,cy,tr);
            }
        }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d%d%d",&lei[i].x.x,&lei[i].x.y,&lei[i].y);
    for(int i=1;i<=n;i++) 
    {
        ll t;
        t=lei[i].x.x*M+lei[i].x.y;
        
        if(is_lei.count(t)) 
        {
            is_lei[t]=max(is_lei[t],lei[i].y);
            num[t]++;
        }
        else 
        {
            is_lei[t]=lei[i].y;
            num[t]=1;
        }
    }
    for(int i=1;i<=m;i++) scanf("%d%d%d",&jian[i].x.x,&jian[i].x.y,&jian[i].y);
    for(int i=1;i<=m;i++) dfs(jian[i].x.x,jian[i].x.y,jian[i].y);
    printf("%d",cnt);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openssl3.2 - note - Writing OpenSSL Provider Skeleton

文章目录 openssl3.2 - note - Writing OpenSSL Provider Skeleton概述笔记测试工程的建立复现的provider工程总结Provider包含的头文件openssl/core.h中的数据结构实现 OSSL_provider_init()看一下openssl自带的提供者provider的openssl命令行测试provider的本质是hook了opens…

pytorch 入门基础知识一(Pytorch 01)

一 深度学习基础相关 深度学习三个主要的方向&#xff1a;计算机视觉&#xff0c;自然语言&#xff0c;语音识别。 机器学习核心组件&#xff1a;1 数据集(data)&#xff0c;2 前向传播的model(net)&#xff0c;3 目标函数(loss)&#xff0c; 4 调整模型参数和优化函数的算法…

【研发管理】产品经理-基础认知

导读&#xff1a;产品经理&#xff08;Product Manager&#xff09;是一个负责产品的全周期管理的职位&#xff0c;他们不仅参与产品的设计、开发、推广和销售&#xff0c;还涉及到产品的市场调研、用户需求分析、竞争分析、产品规划、产品测试以及后续的产品迭代等多个环节。产…

安装snap再安装flutter再安装localsend@Ubuntu(FreeBSD下未成功)

Localsend介绍 localsend是一个跨平台的文件传送软件&#xff0c;可以在Windows、MacOS、Linux、Android和IOS下互相传送文件&#xff0c;只要在同一个局域网即可。 localsend官网&#xff1a;LocalSend 尝试安装localsend&#xff0c;发现需要使用flutter&#xff0c; 安装f…

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz&#xff0c;可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端&#xff0c;输入以下命令更新软件包列表&#xff1a;sudo apt update。之后&#xff0c;使用命令sudo apt install graphviz来安装Graphviz软件包。为…

挑战杯 机器视觉人体跌倒检测系统 - opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器视觉人体跌倒检测系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&…

前端之CSS 创建css--行内引入、内联样式、外联样式

创建css有三种创建样式&#xff0c;行内引入、内联引入、外联引入。 行内引入 在行内标签引入 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>行内样式</title> </head> <body>…

【安全类书籍-3】XSS跨站脚剖析与防御

目录 内容简介 作用 下载地址 内容简介 这本书涵盖以下几点: XSS攻击原理:解释XSS是如何利用Web应用未能有效过滤用户输入的缺陷,将恶意脚本注入到网页中,当其他用户访问时被执行,实现攻击者的目的,例如窃取用户会话凭证、实施钓鱼攻击等。 XSS分类:分为存储型XSS(…

单片机FLASH深度解析和编程实践(下)

本篇文章将同大家分享单片机FLASH编程的相关寄存器和寄存器操作及库函数操作。本篇文章依然以STM32单片机为例进行解析。有关FLASH的基本原理和实现方法&#xff0c;大家可以参考上一篇文章&#xff1a;单片机FLASH深度解析和编程实践&#xff08;上&#xff09;-CSDN博客 目录…

ChatGPT编程—实现小工具软件(文件查找和筛选)

ChatGPT编程—实现小工具软件(文件查找和筛选) 今天借助[小蜜蜂AI][https://zglg.work]网站的ChatGPT编程实现一个功能&#xff1a;根据特定需求结合通配符和其他条件来进行文件查找和筛选。在这个例子中&#xff0c;我们将创建一个函数find_files&#xff0c;它接受用户输入的…

solr/ES 分词插件Jcseg设置自定义词库

步骤&#xff1a; 1、找到配置文件jcseg-core/target/classes/jcseg.properties修改配置&#xff1a; 下载地址: https://gitee.com/lionsoul/jcseg#5-如何自定义使用词库 lexicon.path {jar.dir}/../custom-word 设置lexicon路径&#xff0c;我们这个配置可以自定义&#xf…

Java 与 Go:可变数组

可变数组&#xff08;也称为动态数组&#xff09;是一种可以在运行时动态增加或减少其大小的数据结构。由于其动态分配大小&#xff0c;灵活性增删改查&#xff0c;动态地管理内存&#xff08;在需要时动态分配内存空间&#xff0c;以适应数据结构的大小变化&#xff0c;而不会…

NCV1117ST50T3G线性稳压器芯片中文资料规格书PDF数据手册引脚图图片价格参数

产品概述&#xff1a; NCP1117系列为低压差&#xff08;LDO&#xff09;正向线性电压稳压器&#xff0c;能够提供超过1.0A的输出电流&#xff0c;800mA时温度范围内最大压差为1.2V。这一系列包括八个固定输出电压&#xff1a;1.5V、1.8V、2.0V、2.5V、2.85V、3.3V、5.0V 和 12…

​​SQLiteC/C++接口详细介绍之sqlite3类(十一)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十&#xff09; 下一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十二&#xff09;&#xff08;未发表&#xff09; 33.sq…

【RS422】基于未来科技FT4232HL芯片的多波特率串口通信收发实现

功能简介 串行通信接口常常用于在计算机和低速外部设备之间传输数据。串口通信存在多种标准&#xff0c;以RS422为例&#xff0c;它将数据分成多个位&#xff0c;采用异步通信方式进行传输。   本文基于Xilinx VCU128 FPGA开发板&#xff0c;对RS422串口通信进行学习。   根…

openlayers 入门教程(二):map 篇

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

基于CNN多阶段图像超分+去噪(超级简单版)

这是之前的一项工作&#xff0c;非常简单&#xff0c;简单的复现了两个算法&#xff0c;然后把它们串起来了。 可执行的程序链接&#xff1a;CSDN; Github 我们分成两部分进行讲解&#xff1a; 1. 图像去噪 1.1 基本思路 图像的去噪工作基于很普通的CNN去噪&#xff0c;效…

Java基础 - 9 - 集合进阶(二)

一. Collection的其他相关知识 1.1 可变参数 可变参数就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型…参数名称; 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&#xff1b;可以传一个或者同时传多个数据给…

2核4g服务器够用吗?

2核4G服务器够用吗&#xff1f;够用。阿腾云以2核4G5M服务器搭建网站为例&#xff0c;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&am…

Github Copilot 工具,无需账号,一键激活

① 无需账号&#xff0c;100%认证成功&#xff01;0风险&#xff0c;可联网可更新&#xff0c;&#xff0c;支持copilot版本升级&#xff0c;支持chat ② 支持windows、mac、linux系统等设备 ③一号通用&#xff0c;支持所有IDE(AppCode,CLion,DataGrip,GoLand,IntelliJ IDEA …