每日刷题(图论)

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.mzph.cn/news/878566.shtml

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

相关文章

微信小程序接入客服功能

前言 用户可使用小程序客服消息功能&#xff0c;与小程序的客服人员进行沟通。客服功能主要用于在小程序内 用户与客服直接沟通用&#xff0c;本篇介绍客服功能的基础开发以及进阶功能的使用&#xff0c;另外介绍多种客服的对接方式。 更多介绍请查看客服消息使用指南 客服视…

城市智慧公厕建设,提高市民使用体验,提升城市形象

随着智慧城市的建设步伐不断加快&#xff0c;智慧公厕作为城市公共服务设施的重要组成部分&#xff0c;正逐渐成为提升市民生活质量和城市形象的关键环节。智慧公厕不仅通过一系列先进的软硬件技术改善了市民的如厕体验&#xff0c;还提升了城市的管理水平和文明程度。本文将详…

利用深度学习实现验证码识别-3-ResNet18

在当今数字化时代&#xff0c;验证码作为一种重要的安全验证手段&#xff0c;广泛应用于各种网络场景。然而&#xff0c;传统的验证码识别方法往往效率低下&#xff0c;准确率不高。今天&#xff0c;我们将介绍一种基于 ResNet18 的验证码识别方法&#xff0c;它能够高效、准确…

Canvas绘制线条时断断续续的

解决线条断断续续的关键代码如下&#xff1a; 我们可以使用quadraticCurveTo来实现贝塞尔曲线使其变成光滑的曲线 注意&#xff1a; ctx.value.lineCap "round"; ctx.value.lineJoin "round"; 这两个属性是必须设置的 lastX&#xff0c;…

域名是什么

在这个数字世界中&#xff0c;域名无疑是连接用户与网站的关键纽带。域名&#xff0c;是由一串字符组成的地址&#xff0c;用于在互联网上唯一标识和定位一个特定的资源。本文将深入探讨域名的概念、作用以及对互联网发展的重要性。 一、域名的定义与结构 域名可以看作是互联网…

MySQL第10讲--约束的介绍

文章目录 前言约束约束的演示 外键约束删除外键外键删除/更新行为 前言 在第9讲MySQL第9讲–函数的介绍中我们主要介绍了几种mysql的内置函数&#xff1a;字符串函数、数值函数、流程函数、日期函数&#xff0c;并对这些函数中常用的几种函数做了总结&#xff0c;如下图所示&am…

大跨度工业仓储气膜:零排放与消防安全的理想选择—轻空间

在现代工业仓储领域&#xff0c;气膜结构建筑因其独特的优势逐渐受到企业的青睐。它不仅能够提供大跨度的无柱空间&#xff0c;还具备零排放、环保、快速建造、灵活应用等诸多优点&#xff0c;同时满足严格的消防安全要求&#xff0c;是实现高效仓储管理和可持续发展的理想选择…

为什么bootloader跳转地址要加4?

问题 “我看你验证程序从ROM跳Flash地址要加4&#xff0c;为啥&#xff1f;” 又被问到了&#xff0c;这次记一下&#xff0c;以后谁再问我就直接发链接&#xff0c;必须点赞关注&#xff0c;哈哈 答案 上电流程 ARM内核上电以后会从启动地址开始执行&#xff0c;就是vecto…

某宝上买盗版wordpress的危害和要承担的法律后果

购买和使用盗版WordPress模板存在以下危害和法律后果要点提示&#xff1a; 侵权行为&#xff1a;使用盗版WordPress模板在法律上属于侵犯知识产权&#xff0c;构成侵权行为。 法律责任&#xff1a;可能会面临法律诉讼、罚款甚至刑事责任&#xff0c;如拘留或罚款等。 安全隐…

密钥分发与公钥认证:保障网络通信的安全

在网络通信中&#xff0c;密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用&#xff0c;帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

CF848A From Y to Y

题目概要 对于给定的一个长度为 n n n 的字符串&#xff0c;初始时&#xff0c;我们将它视作 n n n 个长度为 1 1 1 的字符串的可重集&#xff0c;然后重复下列操作 n − 1 n-1 n−1 次&#xff1a; 从这些字符串中任取两个字符串 s , t s,t s,t&#xff0c;将它们删除&…

每天分享一个FPGA开源代码(2)- spi 读写Flash

Flash的用途主要是用于存储主控制器的程序&#xff0c;SPI -Flash芯片就是支持SPI通讯协议的flash芯片。 在FPGA开发中&#xff0c;一般有这两种方式下载程序到板子上&#xff1a; &#xff08;1&#xff09;通过 JTAG下载程序到FPGA中直接运行&#xff0c;下载速度快&#xff…

k8s-pod 实战四 什么是 Kubernetes Pod?如何在生产环境中使用它?(学习专场,实战就看这一篇就够了)

一、pod概念 Kubernetes Pod 是 Kubernetes 中最小的部署单元。每个 Pod 包含一个或多个容器,这些容器共享相同的网络命名空间和存储卷。以下是 Pod 的详细介绍和一个生产实例的使用示例。 Pod 概述 定义:Pod 是 Kubernetes 中可以创建、调度和管理的最小单元,通常包含一个…

新手c语言讲解及题目分享(十四)--函数专项练习(二)

新手c语言讲解及题目分享&#xff08;十四&#xff09;--函数专项练习&#xff08;一&#xff09;-CSDN博客 目录 前言 一.函数调用中的参数传递 1&#xff0e;普通变量作为函数的参数 2&#xff0e;数组元素作为参数 3&#xff0e;数组名作为函数的参数 4&#xff0e;指…

从误删到重生:2024年数据恢复软件市场新趋势与精选工具

现在科技发展越来越先进&#xff0c;大部分的办公内容也都是通过电脑来进行操作的。但是总免不了偶尔会遇到电脑蓝屏或者其他原因导致数据丢失的情况。那辛辛苦苦做好的材料不见了一定很恼火。这次我分享几个电脑数据恢复工具来解决这个问题。 1.福晰数据恢复 连接直达&#…

江苏省地图大屏展示

Html部分绘制echarts图 <div id"chart3" style"width: 100%;height: 100%;"></div>Js部分引入地图数据data.js <script th:src"{/js/geoJson/data.js}"></script> <script type"text/javascript">var…

Nginx负载均衡中的变量使用:动态配置与实践

Nginx是一款功能丰富的Web服务器和反向代理&#xff0c;其负载均衡能力尤为突出。在Nginx的配置中&#xff0c;变量的使用允许实现更灵活和动态的负载均衡策略。本文将详细介绍如何在Nginx负载均衡中使用变量&#xff0c;包括变量的基本概念、使用方法、以及如何通过变量实现高…

docker实战基础五(Dockerfile)

编写高效的 Dockerfile 是确保容器化应用成功的关键步骤。以下是关于如何在 Dockerfile 中创建用户、添加环境变量、使用 ENTRYPOINT、理解 CMD 和 ENTRYPOINT 的区别,以及 ADD 和 COPY 指令的区别的详细说明。 一、创建用户 在Docker容器中运行应用程序时,为了安全性,通常…

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …

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

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