每日刷题(图论)

news2024/11/26 4:41:59

P1119 灾后重建

P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路

看数据范围知道需要用到Floyd算法,但是道路是不能直接用的,需要等到连接道路的两个村庄重建好才可以使用,所以这需要按照时间依次加入中转点,再更新dis数组。

代码

#include<bits/stdc++.h>
#define int long long  
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
const int N = 1e6 + 30;
const int M = 1e3 + 10;
const int inf = 512785182741247112;
const int mod = 100003;
using namespace std;
int f[201][201];
int n, m;
int a[201];

void solve() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            f[i][j] = inf;
        }
    }
    for (int i = 0; i < m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        f[x][y] = f[y][x] = z;
    }
    int q;
    cin >> q;
    int now = 0;
    for (int i = 0; i < q; i++)
    {
        int x, y, t;
        cin >> x >> y >> t;
        if (a[x] > t || a[y] > t)
        {
            cout <<  "-1\n";
            continue;
        }
        while (a[now] <= t&&now<n)
        {
            for (int j = 0; j < n; j++)
            {
                for (int k = 0; k < n; k++)
                {
                    f[k][j]=f[j][k] = min(f[j][k], f[j][now] + f[now][k]);
                }
            }
            now++;
        }
        if (f[x][y] == inf) cout << "-1\n";
        else cout << f[x][y] << "\n";
        
    }
}
signed main() {
  
    ios;
    solve();
    return 0;
}

P6464 [传智杯 #2 决赛] 传送门

P6464 [传智杯 #2 决赛] 传送门 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路

这道题需要我们使用Floyd算法,因为计算全源最短路径需要三层循环,但是没完枚举传送门的建设也需要两重循环,五重循环必定超时,所以我们需要将它优化成四重循环,我们发现建设传送门时只对以传送门建设点为中转点的边有影响,所以我们可以优化为四重循环。

代码

#include<bits/stdc++.h>
#define inf 1234567890
using namespace std;
int n,m,mp1[120][120],mp2[120][120],ans=inf;
void back()//返回原图 
{
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			mp2[i][j]=mp1[i][j];
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	mp1[i][j]=inf;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		mp1[x][y]=mp1[y][x]=z;
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(mp1[i][k]<inf&&mp1[k][j]<inf)//先计算没有建立传送门的最短路径 
				mp1[i][j]=min(mp1[i][j],mp1[i][k]+mp1[k][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			back();//每次返回原图 
			mp2[i][j]=mp2[j][i]=0;//建立传送门 
			for(int x=1;x<=n;x++){
				for(int y=1;y<=n;y++){
					if(mp2[x][j]<inf&&mp2[j][y]<inf)
					mp2[x][y]=min(mp2[x][y],mp2[x][j]+mp2[j][y]);
				}
			}
			for(int x=1;x<=n;x++){
				for(int y=1;y<=n;y++){
					if(mp2[x][i]<inf&&mp2[i][y]<inf)
					mp2[x][y]=min(mp2[x][y],mp2[x][i]+mp2[i][y]);
				}
			}
			int cnt=0;
			for(int x=1;x<=n;x++){
				for(int y=x+1;y<=n;y++){
					cnt+=mp2[x][y];//计算最短路径和 
				}
			}
			ans=min(ans,cnt);//更新最小 
		}
	}
	cout<<ans<<endl;
	return 0;
}

P2349 金字塔

P2349 金字塔 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路

最短路模板题,但是需要维护最大值,一开始我将答案全部储存在dis数组里面,结果只得40分

int n, m, head[N], cnt;
int mxx[N];
struct node
{
    int u, v, w;
}e[N];
void add(int x, int y, int z) {
    e[++cnt].u = y;
    e[cnt].w = z;
    e[cnt].v = head[x];
    head[x] = cnt;
}

void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        add(x, y, z);
        add(y, x, z);
    }
    vector<int>dis(n + 1, inf);
    dis[1] = 0;
    priority_queue<pll>q;
    q.emplace(0, 1);
    while (q.size()) {
        auto it = q.top();
        q.pop();
        int x = it.second;

        for (int i = head[x]; i; i = e[i].v) {
            int now = e[i].u;

            mxx[now] = max(mxx[x], e[i].w);
            if (dis[now] > e[i].w + dis[x] + mxx[now] - mxx[x]) {
                dis[now] = e[i].w + dis[x] + mxx[now] - mxx[x];
                q.emplace(-dis[now], now);
            }
        }
    }
    cout << dis[n] << '\n';
}

所以我们需要用两个数组来维护答案最小值,dis数组和维护的边权最大值,下面是AC代码。

代码

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<algorithm>
#define int long long
#define pb push_back
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define lowbit(x) x&(-x)
#define pll pair<int,int>
const int N = 3e5 + 30;
const int M = 1e3 + 10;
const int inf = 512785182741247112;
const int mod = 1e9 + 7;
using namespace std;
int n, m, head[N], cnt;
int mxx[N];
struct node
{
    int u, v, w;
}e[N];
void add(int x, int y, int z) {
    e[++cnt].u = y;
    e[cnt].w = z;
    e[cnt].v = head[x];
    head[x] = cnt;
}

void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        add(x, y, z);
        add(y, x, z);
    }
    vector<int>dis(n + 1, inf);
    dis[1] = 0;
    priority_queue<pll>q;
    q.emplace(0, 1);
    while (q.size()) {
        auto it = q.top();
        q.pop();
        int x = it.second;

        for (int i = head[x]; i; i = e[i].v) {
            int now = e[i].u;

            if (dis[now] +mxx[now]> e[i].w + dis[x] + max(e[i].w,mxx[x])) {
                mxx[now] = max(e[i].w, mxx[x]);
                dis[now] = e[i].w + dis[x];
                q.emplace(-(dis[now]+mxx[now]), now);
            }
        }
    }
    cout << dis[n]+mxx[n] << '\n';
}


signed main() {

    ios;
    solve();
    return 0;
}

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

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

相关文章

并行数模转换器分辨率的扩展

在并行DAC中存在的一个普遍问题是随着DAC分辨率的提高需要的面积也越来越大。此外&#xff0c;MSB元件值与LSB元件值之比也在增大。我们知道元件的匹配精度随着元件和元件的比值的增大而降低&#xff0c;因此&#xff0c;本节将分析几种能够在元件比和分辨率之间进行权衡的方法…

基于LSTM-AutoEncoder的室内空气质量时间序列数据异常检测

基于LSTM-AutoEncoder的室内空气质量时间序列数据异常检测 LSTM-Autoencoder-Based Anomaly Detection for Indoor Air Quality Time-Series Data DOI: 10.1109/JSEN.2022.3230361 摘要——室内空气质量&#xff08;IAQ&#xff09;数据的异常检测已成为研究的重要领域&…

【SQL】跳过记录筛选第二名

目录 语法 需求 示例 分析 代码 语法 SELECT DISTINCT column1, column2, ... SELECT DISTINCT 语句用于返回唯一不同的值。SELECT DISTINCT 后面跟着想要获取唯一值的列名&#xff0c;列名之间用逗号分隔。当从数据库表中查询数据时&#xff0c;如果表中某列包含重复的…

星坤DDR5 SMT RDIMM金手指连接器:云端存储与高性能计算的未来

在当今数字化时代&#xff0c;数据的快速增长和处理需求对电子元器件提出了更高的要求。星坤电子以其创新的DDR5 SMT RDIMM【X9413 X9414 series】金手指连接器&#xff0c;为云端存储设备、伺服器、电源供应设备、通讯设备、工控主机以及3C电子产品等领域提供了卓越的连接解决…

【ComfyUI】Flux 提示词太难了?Flux Prompt 轻松提示增强!更详细、更具描述性!

前言 所有的AI设计工具&#xff0c;模型和插件&#xff0c;都已经整理好了&#xff0c;&#x1f447;获取~ Flux真的太火了&#xff0c;小编日常也主要以Flux出图为主了。但每每写提示词时有没有人和老徐有类似的情况&#xff0c;就是经常为写提示词而穷思苦想呢&#xff1f;怎…

Google开发者账号个人身份验证经验分享

本文主要讲解Google Play 个人身份验证过程中的注意事项和完整的填写指导教程&#xff0c;为个人开发者身份验证提供参考指引&#xff0c;帮助大家快速通过谷歌的身份信息验证 个人身份验证注意事项 梳理了这段时间个人身份验证填写过程中遇到的问题和解决方案&#xff0c;先睹…

RocketMQ高级特性三-消费者分类

目录 前言 概述 区别 PullConsumer 定义与概述 原理机制 使用场景 优缺点 Java 代码示例 SimpleConsumer 定义与概述 原理机制 使用场景 优缺点 Java 代码示例 PushConsumer 定义与概述 原理机制 使用场景 优缺点 Java 代码示例 总结 前言 RocketMQ中的消…

SpringMVC 第一次复学笔记

服务器启动时&#xff0c;创建spring容器&#xff1b;dispatcherServlet启动时&#xff0c;直接创建springmvc容器初始化一次&#xff0c;实现了springmvc和spring的整合。 SpringMVC里的组件 处理器映射器&#xff08;HandlerMapping&#xff09;负责匹配映射路径对应的Handl…

小琳Python课堂:Python全局解释器锁(GIL)的深入解析与应用

小琳Python课堂开讲啦&#xff01;今天我们来深入探讨Python中的一个重要概念——全局解释器锁&#xff08;GIL&#xff09;。&#x1f512; 技术细节角度 单线程执行保证&#xff1a;GIL确保了在任何时刻只有一个线程在执行Python字节码。互斥锁实现&#xff1a;GIL通过在解…

无人机之发动机篇

一、无人机发动机的分类 无人机发动机根据工作原理和应用场景的不同&#xff0c;主要分为以下几类&#xff1a; 电动马达&#xff1a; 特点&#xff1a;清洁、高效、体积小巧、重量轻便、噪音低、对环境影响小。 应用&#xff1a;多用于小型或微型无人机&#xff0c;因其续航…

Nature Microbiology|WISH标签技术:评估微生物组中单株水平的种群动态

微生态研究搞了n多年&#xff0c;益生菌还是那么几个&#xff0c;为什么&#xff1f; 一个共识是单一菌株的添加往往难以解决复杂问题。微生物群体的相互作用和平衡不应被忽视。实际上&#xff0c;我们需要在群体层面进行添加或干预&#xff0c;才能真正发挥益生菌的作用。然而…

AD原理图无法输入中文的问题及解决办法

电脑系统&#xff1a;Windows 11 专业版 AD版本&#xff1a;20.0.14 解决方法&#xff1a; 方法1、在word打好&#xff0c;复制到AD 方法2、尝试快捷键ctrlshift、ctrl空格、windows空格

超声波眼镜清洗机有用吗?清洁力好的超声波清洗机推荐

在当今快节奏的生活中&#xff0c;维持良好的卫生状况已成为日常不可或缺的一部分&#xff0c;尤其对于追求高品质生活方式的人来说更为重要。因此&#xff0c;选择一款高效便捷的超声波清洗机成为了提升居家清洁体验的理想方案。面对市面上琳琅满目的品牌&#xff0c;甄选出既…

24全网最全stable diffusion模型讲解!快来!!新手必收藏!!

前言 手把手教你入门绘图超强的AI绘画程序Stable Diffusion&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新Stable Diffusion保姆级教程资料包&#xff08;文末可获取&#xff09; AI模型最新展现出的图像生成能力远远超出人…

扫雷游戏(上)

开学快乐 今天我们来写扫雷的代码 一、了解扫雷是怎么玩儿的 首先这里放一个扫雷游戏的链接扫雷游戏网页版 - Minesweeper 然后我们点进去耍了一阵&#xff0c;发现扫雷首先要有一个棋盘&#xff0c;然后在玩家不知道的情况下设置雷在不同的格子&#xff0c;玩家点到雷就炸死…

arm调试-- gdb与gdbserver的安装与使用

一、安装 1.下载gdb源码 https://ftp.gnu.org/gnu/gdb/gdb-7.11.1.tar.gz 2. 解压编译gdb以及gdbserver (1)gdb PC端 tar -zxvf gdb-7.11.1.tar.gz cd gdb-7.11.1 mkdir _install ./configure --targetaarch64-linux-gnu --disable-werror --prefix/home/jinhao/gdb-7.1…

Maven聚合与继承

聚合 当我们一次想要构建多个项目时&#xff0c;而不是到每一个模块的目录下分别执行mvn命令。这个时候就需要使用到maven的聚合特性 这里第一个特殊的地方是packaging&#xff0c;值设置为pom。我们正常开发的其他模块中都没有声明packaging&#xff0c;默认使用了默认值jar&a…

Android Studio 最新版本保姆级安装使用教程

Android Studio 2024 最新版本保姆级安装使用教程 1、官网下载2、安装Standard默认配置Custom配置 3、视频教程 这里是Android Studio 2024最新版本保姆级安装教程&#xff0c;高级版本基本上通用~ Android 是为世界各地的所有用户打造的&#xff0c;无论从设计、功能还是整体价…

操作系统面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 线程切换要保存哪些上下文&#xff1f; 当发生线程切换时&#xf…

8、Django Admin后台中添加Logo

在项目settings.py文件 # 导入os&#xff0c;并且修改DIRS内容如下所示 import os TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates/)],APP_DIRS: True,OPTIONS: {context_processors: [django.template.con…