浙大数据结构:07-图4 哈利·波特的考试

这道题使用Floyd算法,初次接触该算法会比较难理解,需要去网上查找相关资料多学习一下再来思考这道题,否则这道题理解起来很吃力。

1、条件准备        

 #include <bits/stdc++.h>#define rep(i, l, r) for (int i = l; i <= r; i++)using namespace std;#define endl '\n'
 先存图,用w二维数组来存,输入两条边和权重,存到数组中
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m;cin>>n>>m;vector<vector<int>> w(n+3,vector<int>(n+3,20000));rep(i,1,m){int a,b,c;cin>>a>>b>>c;w[a][b]=w[b][a]=c;}

2、bfs算法

因为是无向图,所以从任意起点出发如果没走完所有点,那么这个图不是连通的输出0.
if(bfs(w,n)!=n){cout<<'0';return 0;}
这里还是用数组模拟队列,从结点1开始遍历。
返回遍历的结点数量
int bfs(vector<vector<int>>& w,int n)
{int q[105];int tt=-1,hh=0;q[++tt]=1;int visit[105]={0};visit[1]=1;while(hh<=tt){int cur=q[hh++];rep(i,1,n){if(!visit[i]&&w[cur][i]!=20000){q[++tt]=i;visit[i]=1;}}}return tt+1;
}

3、floyd算法

其实该算法是一种动态规划,dp[k][i][j]的含义是从i到j的最短路经过的最大结点为k。

  • 不选 k,那么中间节点的编号都 ≤k−1,即 dp(k,i,j)=dp(k−1,i,j)。
  • 选 k,问题分解成从 i 到 k 的最短路,以及从 k 到 j 的最短路。由于这两条最短路的中间节点都不包含 k,所以中间节点的编号都 ≤k−1,故得到 dp(k,i,j)=dp(k−1,i,k)+dp(k−1,k,j)。
因为结点从1开始,我们把k为0的时候存上图,最后就能让上层扫到了 
  vector<vector<vector<int>>> dp(n+3,vector<vector<int>>(n+3,vector<int>(n+3,0)));dp[0]=w;rep(k,1,n)rep(i,1,n)rep(j,1,n)dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[k-1][k][j]);

4、找最远距离最短输出

ans为某点到所有结点的最远距离。node为结点编号。
遍历dp最顶层,存的即为任意两点之间最短距离。
循环遍历,sum存该节点到其它结点的最远距离,注意i!=j
sum如果小于ans则更新答案
int ans=20000,node;rep(i,1,n){int sum=0;rep(j,1,n){if(j!=i)sum=max(sum,dp[n][i][j]);}if(sum<ans){ans=sum;node=i;}}cout<<node<<' '<<ans;

5、总结

这道题的难点在于floyd算法,建议初学者去查找一些类似题对该算法的详细解释再来做本题。
不过这个算法开始还是比较难理解的,需要反复多次想才能真正明白。
完整代码如下:
  #include <bits/stdc++.h>#define rep(i, l, r) for (int i = l; i <= r; i++)using namespace std;#define endl '\n'int bfs(vector<vector<int>>& w,int n)
{int q[105];int tt=-1,hh=0;q[++tt]=1;int visit[105]={0};visit[1]=1;while(hh<=tt){int cur=q[hh++];rep(i,1,n){if(!visit[i]&&w[cur][i]!=20000){q[++tt]=i;visit[i]=1;}}}return tt+1;
}int main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m;cin>>n>>m;vector<vector<int>> w(n+3,vector<int>(n+3,20000));rep(i,1,m){int a,b,c;cin>>a>>b>>c;w[a][b]=w[b][a]=c;}if(bfs(w,n)!=n){cout<<'0';return 0;}vector<vector<vector<int>>> dp(n+3,vector<vector<int>>(n+3,vector<int>(n+3,0)));dp[0]=w;rep(k,1,n)rep(i,1,n)rep(j,1,n)dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[k-1][k][j]);int ans=20000,node;rep(i,1,n){int sum=0;rep(j,1,n){if(j!=i)sum=max(sum,dp[n][i][j]);}if(sum<ans){ans=sum;node=i;}}cout<<node<<' '<<ans;return 0;}

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

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

相关文章

华为 HCIP-Datacom H12-821 题库 (32)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.当一个运行 MSTP 协议的交换设备端口收到一个配置BPDU 时&#xff0c;会与设备保存的全局配…

CF D. Minimize the Difference

原题链接&#xff1a;Problem - D - Codeforces 题意&#xff1a;给你长度为n的数组&#xff0c;可以无限次的让i位置的数-1&#xff0c;让i1的位置的数1。问最大值-最小值的最小值是多少&#xff1f; 思路&#xff1a;可以观察出&#xff0c;操作的真正意义是让i位置的数减少…

数字乡村智慧乡镇整体规划设计解决方案

1. 数字乡村的重要性 数字乡镇作为乡村振兴战略的一部分&#xff0c;通过信息化手段提高农业农村现代化水平&#xff0c;是建设数字中国的重要内容&#xff0c;对保障扶贫成果、促进乡村治理体系和治理能力现代化具有基础支撑作用。 2. 乡镇政府和农户面临的问题 乡镇政府和…

Linux 之 安装软件、GCC编译器、Linux 操作系统基础

安装软件、GCC编译器、Linux 操作系统基础 学习任务&#xff1a; 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…

电源管理芯片PMIC

一、简介 电源管理芯片&#xff08;Power Management Integrated Circuits&#xff0c;简称PMIC&#xff09;是一种集成电路&#xff0c;它的主要功能是在电子设备系统中对电能进行管理和控制&#xff0c;包括但不限于以下几点&#xff1a; 电压转换&#xff1a;将电源电压转换…

IndexTree、AC自动机

一、引言。 IndexTree和线段树有一些联系&#xff0c;这里我们再重新解释一下线段树用来解决什么样的一个问题&#xff0c;线段树解决的是一个区间查询和区间更新的一个问题&#xff0c;比如说我有一个数组在 L....R 上统一加上V&#xff0c;或者在L.....R上&#xff0c;统一所…

硬件设计-利用环路设计优化PLL的输出性能

目录 前言 问题描述 问题分析步骤 杂散源头排查 245.76M 参考相噪&#xff1a; 30.72M VCXO的相噪性能测试如下: 解决方案 前言 LMK04832是TI 新发布的低抖动双环去抖模拟时钟&#xff0c; 其最高输出频率可以到达3250MHz&#xff0c; 输出抖动极低&#xff0c;3200MHz…

Sentinel学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

Linux基本命令及vim应用实训练习

Linux基本命令及vim应用实训练习 1. 2. 3. 4. 5. 使用man cp找出

序列化与反序列化基础及反序列化漏洞(附案例)

参考文章&#xff1a; [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容&#xff0c;经常需要通过序列化对数据进行处理&#xff0c;将数据进行序列化后&#xff0c;会生成一个字符串&#xff0c;字符…

linux安装minianconda

文章目录 我的配置从清华镜像源里下载minianaconda安装自定义安装位置是否关闭打开终端默认进入anaconda的设置&#xff1f;&#x1f315;配置清华镜像源 我的配置 ubuntu 22.04LTS 从清华镜像源里下载minianaconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/minicond…

带你深入浅出设计模式:七、代理模式:设计模式中的中间人

此为设计模式第七谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;代理模式为其他对象提供一个代理来控制这个对象的访问&#xff0c…

openpnp - 坐标文件中的元件0角度如果和编带规定的角度不一样,需要调整贴片任务中的元件旋转角度

文章目录 openpnp - 坐标文件中的元件0角度如果和编带规定的角度不一样&#xff0c;需要调整贴片任务中的元件旋转角度笔记查看自己图纸中的封装的0角度方法贴片任务的角度值范围编带规定的0角度根据编带规定的元件0角度来调整贴片的元件旋转角度如果是托盘飞达备注备注END ope…

Python并发编程(3)——Python多线程详解介绍

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取python编程资料 Python 的多线程入门是非常简单的&#xff0c;直接导入threading模块就可以开始多线程之旅了。模…

弧形导轨驱动器高效使用技巧!

弧形导轨驱动器是一种用于驱动滑座沿着导轨做弧线运动的设备&#xff0c;其用方法因具体型号和应用场景的不同而有所差异&#xff0c;通常可以归纳为以下几个步骤&#xff1a; 1、安装前要明确弧形导轨的使用需求&#xff0c;根据需求选择合适的弧形导轨驱动器&#xff0c;准备…

深度学习基础—目标检测算法

目录 1.滑动窗口算法 2.滑动窗口的卷积实现 &#xff08;1&#xff09;1*1卷积的作用 &#xff08;2&#xff09;全连接层转化为卷积层 &#xff08;3&#xff09;在卷积层上实现滑动窗口 3.Bounding Box预测&#xff08;YOLO算法&#xff09; 1.滑动窗口算法 假如要构建一…

【AI知识点】泊松分布(Poisson Distribution)

泊松分布&#xff08;Poisson Distribution&#xff09; 是统计学和概率论中的一种离散概率分布&#xff0c;通常用于描述在固定时间或空间内&#xff0c;某个事件发生的次数。该分布适用于稀有事件的建模&#xff0c;特别是当事件发生是独立的、随机的&#xff0c;且发生的平均…

PCL 点云体素滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 体素滤波实现 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xf…

【RISCV指令集手册】向量扩展v1.0

概述 从rvv 0.9说起 此前写过向量扩展0.9的阅读记录&#xff0c;三年已过&#xff0c;本以为不再参与RVV的相关开发&#xff0c;奈何造化弄人&#xff0c;旧业重操&#xff0c;真就世事难料呀。 总的来说1.0版本相比0.9版本的扩充了较多内容&#xff0c;但大部分为指令功能的…

YOLOv8改进线性注意力模块 ICCV2023 FLatten Transformer

1,原理部分 论文地址:2308.00442 (arxiv.org) 在将 Transformer 模型应用于视觉任务时,自我注意的二次计算复杂性一直是一个持续的挑战。另一方面,线性注意力通过精心设计的映射函数近似 Softmax 操作,通过其线性复杂性提供了一种更有效的替代方案。然而,当前的线性注意…