ACM-大一训练第三周(Floyd算法+并查集算法专题训练)

news2024/12/28 17:46:18

🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.CSDN
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:ACM周训练题目合集.CSDN
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️为什么我们不知疲倦,因为我们都在做自己所热爱的事 ♐

文章目录

  • A - 电车
  • B - 并查集
  • C - 最短路
  • D - 修复公路
  • E - 青蛙
  • F - 炸铁路
  • G - DZY热爱化学
  • H - 合根植物
  • 总结


在这里插入图片描述

A - 电车

洛谷:P1346 电车
在这里插入图片描述
解题思路:Floyd算法的运用,这里大致讲解一下题目,从第二行开始就是第一个车道 接着就是开关思想,也就是01思想,这里对于电路,或者种树是否这些题目都是一个经验,对于这个题目后面也会对Floyd算法做一个总结

#include<iostream>
#include<cmath>
#include<cstring>

using namespace std;

#define N  0x3f3f3f3f //一个特别大的数字,记住这个知识点
int n,a,b,m,x,f[1001][1001];

int main()
{
    memset(f,N,sizeof f);//初始化
    
    cin>>n>>a>>b;
    
    for(int i=1;i<=n;i++)//初始化---自己到自己是0
    {
        f[i][i]=0;
    }
    
    for(int i=1;i<=n;i++)//n条道路所以 for循环0-n
    {
        cin>>m;//组的变向与不变向
        
        for(int j=1;j<=m;j++)
        {
            cin>>x;
            if(j==1)
            {
                f[i][x]=0;//第一个必须设置为0,表示不变向
            }
            else 
            {
                f[i][x]=1;//表示变向的情况
            }
        }
    }
    //标准的Floyd算法模板
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i!=j || i!=k || j!=k)
                {
                    f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
                }
            }
        }
    }
    //输出
    if(f[a][b]==N) cout<<"-1"<<endl;
    else cout<<f[a][b]<<endl;
    
    return 0;
}

B - 并查集

AcWing—836. 合并集合
在这里插入图片描述
解题思路:并查集的模板题目,这里不多赘述。

#include<iostream>

using namespace std;

const int N=100010;

int p[N];
int n,m;

int find(int x) //目的:找到父节点 并且返回+路径压缩
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}

int main()
{
    scanf("%d%d",&n,&m);
    
    for(int i=1;i<=n;i++) p[i]=i; //开始只有自己一个元素一个集合
    
    while(m--)
    {
        char op[2];
        int a,b;
        scanf("%s%d%d",&op,&a,&b);
        if(op[0]=='M') p[find(a)]=find(b);
        else
        {
            if(find(a) == find(b)) puts("Yes");
            else puts("No");
        }
    }
    
    return 0;
}

C - 最短路

在这里插入图片描述
题目来自计蒜客,不过我不知道在哪里找到这个题目,大家下去自己去试一试

解题思路:基础Floyd算法,这个更加模板

#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;

int n,m;
int u,v,w;
int g[110][110];
int path[110][110];
const int maxx=99999999;
int main()
{
    cin>>n>>m;
    again:
    for(int i=1;i<=n;i++)//初始化
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j) g[i][j]=0;
            else g[i][j]=maxx;
        }
    }
    
    for(int i=1;i<=m;i++)//链接道路
    {
        cin>>u>>v>>w;
        g[u][v]=g[v][u]=w;
    }
    
    for(int k=1;k<=n;k++)//Floyd算法模板
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(g[i][j]>g[i][k]+g[k][j])
                {
                    g[i][j]=g[i][k]+g[k][j];
                }
            }
        }
    }
    
    printf("%d\n",g[1][n]);//根据题意打印答案
    
    cin>>n>>m;
    
    if(n==0&&m==0) return 0;
    else goto again;
    
    return 0;
}

D - 修复公路

洛谷:P1111 修复公路
在这里插入图片描述
解题思路:并查集思路,不过运用到了结构体的基础知识,模板基础上加一些东西罢了。

#include<iostream>
#include<algorithm>

using namespace std;

struct node
{
	int x,y,t;
}a[100010];

int n,m,p[100010];

int cmp(node a,node b)//按照t进行排序
{
	return a.t<b.t;
}

int find(int x)//并查集算法模板
{
	return p[x]==x?x:(p[x]=find(p[x]));
}

int main()
{
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=m;i++)
	  scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].t);
	  
	sort(a+1,a+m+1,cmp);
	
	for(int i=1;i<=n;i++) p[i]=i;
	 
	for(int i=1;i<=m;i++)
	{
		int px=find(a[i].x);
		int py=find(a[i].y);
		
		if(px!=py) p[px]=py,n--;
		
		if(n==1) 
		{
			cout<<a[i].t;
			return 0;
		}
		
	}
	cout<<"-1"<<endl;
	return 0;
}

E - 青蛙

在这里插入图片描述

#include<iostream>
#include<cmath>
#include<cstring>

using namespace std;

#define inf 0x3f3f3f3f

int x[300],y[300],n;
double g[300][300];

int main()
{
    int q=1;
    while(cin>>n&&n)
    {
        memset(g,inf,sizeof(g));
        for(int i=1;i<=n;i++)
        {
            cin>>x[i]>>y[i];
        }
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                g[i][j]=g[j][i]=sqrt(double(x[i]-x[j])*(x[i]-x[j])+double(y[i]-y[j])*(y[i]-y[j]));
            }
        }
        
        for(int k=1; k<=n; k++)
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                    g[i][j]=min(g[i][j],max(g[i][k],g[k][j]));
        
        printf("Scenario #%d\nFrog Distance = %.3lf\n\n",q++,g[1][2]);
        
    }
}

F - 炸铁路

P1656 炸铁路
在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

#define inf ox3f3f3f3f
int n,m,f[151],b[151];
struct City
{
    int a,b;
}p[5010];

int find(int x)
{
    if(f[x]==x) return x;
    else return f[x]=find(f[x]);
}

bool cmp(City x,City y)
{
    if(x.a==y.a) return x.b<y.b;
    return x.a<y.a;
}

void he(int x,int y)
{
    int x1=find(x),y1=find(y);
    f[y1]=f[x1];
}


int main()
{
    cin>>n>>m;
    
    for(int i=1;i<=m;i++)
    {
        cin>>p[i].a>>p[i].b;
        if(p[i].a>p[i].b)
        {
            int t=p[i].a;
            p[i].a=p[i].b;
            p[i].b=t;
        }
    }
    
    sort(p+1,p+m+1,cmp);
    
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            f[j]=j;
        }
        
        for(int j=1;j<=m;j++)
        {
            if(j!=i)
            {
                he(p[j].a,p[j].b);
            }
        }
        
        for(int j=2;j<=n;j++)
        {
            if(f[find(j)]!=f[find(j-1)])
            {
                cout<<p[i].a<<" "<<p[i].b<<endl;
                break;
            }
        }
    }
    
    return 0;
}

G - DZY热爱化学

题目来自cf,具体我这里不链接了。
在这里插入图片描述
解题思路:并查集思路,模板基础上加一些东西罢了。

#include<iostream>
#include<cmath>

using namespace std;

typedef long long ll;
const int N=100010;
int p[N];
int n,m;

int find(int x)
{
    return p[x]==x?x:(p[x]=find(p[x]));
}

int main()
{
    cin>>n>>m;
    
    for(int i=1;i<=n;i++) p[i]=i;
    
    if(m==0)
    {
        printf("1");
        return 0;
    }
    
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        a=find(a);
        b=find(b);
        if(a!=b)
        {
            p[a]=b;
        }
    }
    
    ll ans=0,cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(find(i)!=i)
        {
            ++ans;
        }
    }
    
    ll c=pow(2,ans);
    
    printf("%lld\n",c);
    
    return 0;
}

H - 合根植物

P8654 [蓝桥杯 2017 国 C] 合根植物
在这里插入图片描述
解题思路:并查集思路,模板基础上加一些东西罢了。

#include<iostream>
#include<cmath>

using namespace std;

int n,m,k;
int p[100000010];

int find(int x)
{
	return p[x]==x?x:(p[x]=find(p[x]));
}

int main()
{
    cin>>n>>m>>k;
    
    int res=n*m;
    
    for(int i=1;i<=res;i++) p[i]=i;
    int ans=0;
    while(k--)
    {
        int a,b;
        cin>>a>>b;
        a=find(a);
        b=find(b);
        if(a!=b)
        {
            p[a]=b;
        }
    }
    
    for(int i=1;i<=res-1;i++)
    {
        if(find(i)!=find(i+1))
        {
            ans++;
            p[find(i)]=find(i+1);
        }
    }
    
    
    cout<<ans+1<<endl;
    
    return 0;
}

总结

并查集:
做题思路:你会发现,你只需要输入操作+合并也就是find函数
再进行for循环遍历一遍就可以得到答案,不信你可以看看我写
的那些题目的共同特点真的非常相似,或许因为初学的缘故真的会发现
非常简单,因为就是这样用的

Floyd算法:

初始化+三层for循环+输出基本就是这个算法的模板,但是最困难的是建图的过程,这个需要特别训练

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

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

相关文章

五、Bean的作用域

1 singleton 默认情况下&#xff0c;Spring的IoC容器创建的Bean对象是单例的。测试&#xff1a; package com.power.spring6.bean;public class SpringBean {public SpringBean() {System.out.println("无参数构造方法执行了");} }<?xml version"1.0"…

Ubuntu中使用Synaptic进行包管理

Synaptic概况 Synaptic 是一个轻量级的 apt 软件包管理器系统的 GUI 前端&#xff0c;所有你可以在终端中使用 apt-get 命令来做的事&#xff0c;都可以通过 Synaptic 来实现。优势 图形化安装界面&#xff0c;同时可以安装配置相关依赖&#xff0c;避免由于依赖问题导致的各类…

【c++】2023杭州月薪个税计算(chatGPT帮忙加注释)

参考信息 杭州市的个人所得税起征点是每月5000元。 个人所得税税率标准&#xff1a; 1、工资范围在1-5000元之间的&#xff0c;包括5000元&#xff0c;适用个人所得税税率为0%; 2、工资范围在5000-8000元之间的&#xff0c;包括8000元&#xff0c;适用个人所得税税率为3%; 3、工…

SpringBoot3.0 + SpringSecurity6.0+JWT

JWT_SpringSecurity SpringBoot3.0 SpringSecurity6.0JWT Spring Security 是 Spring 家族中的一个安全管理框架。 一般Web应用的需要进行认证和授权。 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户 授权&#xff1a;经过认…

「C/C++」 标准文件操作大全

一、设备文件&#xff08;运行程序时会默认打开这三个设备文件&#xff09; stdin&#xff1a;标准输入&#xff0c;默认为当前终端&#xff08;键盘&#xff09;&#xff0c;我们使用的scanf、getchar函数默认从此终端获得数据。stdout&#xff1a; 标准输出&#xff0c;默认…

当你问ChatGPT一些奇奇怪怪的问题

ChatGPT热度好像已经没那么高了&#xff0c;貌似也蹭不到什么流量了&#xff0c;不过嘛&#xff0c;玩了一下好玩的还是得记录一下。每个问题用标题给出&#xff0c;就可以当目录了。同时附上截图&#xff0c;想直接看图的伙伴可以直接看图。回答以绿色背景的形式给出。 觉得有…

坚如磐石:TiDB 基于时间点的恢复(PiTR)特性优化之路丨6.5 新特性解析

本文介绍了 TiDB 数据库的基于时间点的恢复&#xff08;PiTR&#xff09;特性&#xff0c;该特性允许用户将数据库恢复到特定时间点&#xff0c;从而避免丢失重要数据。文章首先介绍了 PiTR 技术的基本概念和工作原理&#xff0c;接着探讨了 TiDB 对 PiTR 的优化&#xff0c;包…

Java多线程(二)——同步

这一节主要是继上次提到的线程同步三大方法&#xff1a;同步代码块、同步方法、Lock锁。同步代码块&#xff0c;把出现线程安全问题的核心代码给上锁。还是继上次的例子&#xff0c;对代码块加上synchronized ("getMoney") {}之后就不会出现线程安全问题了&#xff1…

文科女生月入14k背后:转行IT软件测试不是谁都学得来!

转行软件测试背后&#xff0c;或许每个人都有自己的无奈。就拿今天要和大家分享的这位小姐姐来说吧&#xff0c;如果不是万不得已&#xff0c;又怎么会狠下心来转行到IT互联网&#xff1f; 应届生逃避就业&#xff0c;考研失败 和大多数人一样&#xff0c;小姐姐的大学生活过得…

SpringBoot入门 - 添加内存数据库H2

上文我们展示了通过学习经典的MVC分包结构展示了一个用户的增删查改项目&#xff0c;但是我们没有接入数据库&#xff1b;本文将在上文的基础上&#xff0c;增加一个H2内存数据库&#xff0c;并且通过Spring 提供的数据访问包JPA进行数据查询。准备知识点在介绍通过Spring JPA接…

专访华西二院吴邦华:隐私计算+AI全栈技术,构筑智慧医院建设的坚实数据底座|爱分析访谈

从IT时代步入DT时代&#xff0c;医疗大数据成为智慧医院建设的重要驱动力。经过多年信息化系统建设&#xff0c;很多医院已经积累了大量的医疗数据资源&#xff0c;但由于各业务系统间数据孤岛化严重、系统架构落后、数据缺乏深度治理等问题存在&#xff0c;导致现有数据深度及…

springsecurity中的类

Authentication AuthenticationProvider 每一个AuthenticationProvider对应一个Authentication 很多个AuthenticationProvider 由一个 ProviderManager管理 ProviderManager implements AuthenticationManager 一个ProviderManager有很多个 AuthenticationProvider Usern…

EasyPoi的excel模板预览与下载、导出简单/复杂数据

官方文档地址&#xff1a;easypoi官网&#xff0c;官方仅供参考&#xff0c;部分描述有问题 excel模板预览 准备工作 事先将整理好的excel模板存在项目中&#xff0c;如图 excel模板预览代码 GetMapping("excel")ApiOperation("excel预览")NoLogpubli…

多个关键字用or、and、包含、不包含动态拼接为正则表达式和SQL查询条件

目录前言校验思路1、存储方式2、实现图一实现图二实现结果最后前言 不知道大家有没有做过这种需求&#xff1a;在某字符串中&#xff0c;根据多个关键字去判断这串字符串是否满足条件。如下图&#xff1a; 亦或是 如果说要根据图二的关键字去数据库中查询符合条件的数据&a…

QT基础(18)- QAbstractSocket

QT基础&#xff08;18&#xff09;- QAbstractSocket1 创建简单的客户端2 QAbstractSocket2.1 简介2.2 枚举2.2.1 BingFlag2.2.2 NetworkLayerProtocol2.2.3 PauseMode2.2.4 SocketError2.2.5 SocketOption2.2.6 SocketType2.2.7 SocketState2.3 公有函数2.3.1 构造函数2.3.2 a…

文献阅读(47)—— 遗传数据研究近视和眼压与视网膜脱落的关系

文献阅读&#xff08;47&#xff09;—— 遗传数据研究近视和眼压与视网膜脱落的关系 文章目录文献阅读&#xff08;47&#xff09;—— 遗传数据研究近视和眼压与视网膜脱落的关系遗传数据研究近视和眼压与视网膜脱落的关系先验知识/知识拓展文章结构文章结果1. 视网膜脱落风险…

centos8安装docker运行java文件

本文由个人总结&#xff0c;如需转载使用请标明原著及原文地址 这里是基于我前一篇搭的centos8服务器做的&#xff0c;如果yum baseos源或appstream源有问题可以去看看前一篇 https://blog.csdn.net/qq_36911145/article/details/129263830 1.安装docker 1.1配置docker yum…

惠普战66pro如何选购内存条?一篇文章讲解清楚

笔记本&#xff1a;惠普 ZHAN66 PRO CPU&#xff1a;Intel Core™ i-8565U CPU 1.80GHz 内存条&#xff1a;Samsung PS: 如果有需要更换硬盘的可以看我之前发的文章&#xff0c;博主进行了长时间的测试。 硬盘选购长测评 文章目录前言一、内存是什么&#xff1f;二、如何操作呢…

错误:EfficientDet网络出现“No boxes to NMS“并且mAP:0.0的解决方案

近日&#xff0c;在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候&#xff0c;出现了如下错误&#xff1a; 其中项目开源地址是&#xff1a;https://github.com/toandaominh1997/EfficientDet.Pytorch 上面截图中的1和2代表我的类别名称。读者可…

【计算机二级python】综合题题目

计算机二级python真题 文章目录计算机二级python真题一、八十天环游世界二、八十天环游世界 问题一二、八十天环游世界 问题二一、八十天环游世界 附件中保存1个文本文件&#xff0c;分别对应2个问题‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬…