ZISUOJ 数据结构--图及其应用

说明

        主要考察建图,图的遍历以及求最小生成树。都还是比较简单的,后面就直接上代码了。

        最小生成树采用prim还是kruskal算法要看题目怎么给出数据,如果以邻接矩阵的形式给出,采用prim算法比较合适,如果以边和边的权重的形式给出,则采用kruskal算法比较合适。例如这里的D和E题采用kruskal算法比较好,但是不代表用prim算法不能做,我这两个题给出的就是prim的解法,但是某些题用另一个算法极不方便,因此还是建议采用题目所暗示我们应使用的方法最佳。

题目列表

问题 A: 图的遍历—深度优先搜索—邻接矩阵

参考题解:

#include <iostream>
#include <functional>int main(){std::cin.tie(nullptr)->sync_with_stdio(false);constexpr int MAX_N = 5e1+5;int g[MAX_N][MAX_N] {};bool vis[MAX_N] {};int n;std::cin >> n;for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){std::cin >> g[i][j];}}using Dfs = std::function<void(int)>; Dfs dfs = [&](int u) {std::cout << u << ' ';for(int i = 0;i<n;i++){if(g[u][i]&&!vis[i]) vis[i]=true,dfs(i);}};vis[0] = true;dfs(0);std::cout << '\n';return 0;
} 

问题 B: 图的遍历—DFS—已知边

参考题解:

#include <iostream>
#include <functional>int main(){std::cin.tie(nullptr)->sync_with_stdio(false);constexpr int MAX_N = 1e1+5;int g[MAX_N][MAX_N] {};bool vis[MAX_N] {};int n,m;std::cin >> n >> m;while(m--){int x,y;std::cin >> x >> y;g[x][y]=g[y][x]=1;}using Dfs = std::function<void(int)>;Dfs dfs = [&](int u){std::cout << u << ' ';for(int i = 1;i<=n;i++){if(g[u][i]&&!vis[i]) vis[i]=true,dfs(i);}};vis[1] = true;dfs(1);std::cout << '\n';return 0;
} 

问题 C: 图的遍历—广度优先搜索

参考题解:

#include <iostream>
#include <queue>int main(){std::cin.tie(nullptr)->sync_with_stdio(false);constexpr int MAX_N = 5e1+5;int g[MAX_N][MAX_N] {};bool vis[MAX_N] {};int n;std::cin >> n;for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){std::cin >> g[i][j];}}auto bfs = [&](){std::queue<int> q;q.emplace(0);vis[0] = true;while(!q.empty()){auto t = q.front();q.pop();std::cout << t << ' ';for(int i = 0;i<n;i++){if(!vis[i]&&g[t][i]){vis[i] = true;q.emplace(i);}}}};bfs();std::cout << '\n';return 0;
} 

问题 D: 最小生成树-局域网

 

参考题解:

#include <iostream>
#include <cstring>
#include <type_traits>
template<typename T1,typename T2>
typename std::common_type<T1,T2>::type min(T1 num1,T2 num2){return num1>num2?num2:num1;
}
int main(){std::cin.tie(nullptr)->sync_with_stdio(false);constexpr int MAX_N = 1e2+5,INF = 0x3f3f3f3f;int g[MAX_N][MAX_N];int dist[MAX_N];memset(g,0x3f,sizeof g);bool vis[MAX_N] = {false};int n,m;std::cin >> n >> m;int ans = 0;while(m--){int x,y,w;std::cin >> x >> y >> w;g[x][y]=g[y][x]=min(g[y][x],w);ans+=w;}auto prim = [&]()->int{memset(dist,0x3f,sizeof dist);dist[1] = 0;int ans = 0;for(int i = 0;i<n;++i){int t = -1;for(int j = 1;j<=n;++j){if(!vis[j]&&(t==-1||dist[t]>dist[j])) t = j;}if(dist[t]==INF) return INF;ans+=dist[t];vis[t] = true;for(int j = 1;j<=n;++j) dist[j] = min(dist[j],g[t][j]);}return ans;};ans-=prim();std::cout << ans << '\n';return 0;
} 

问题 E: 最小生成树-繁忙的都市

 

参考题解:

#include <iostream>
#include <cstring>
#include <type_traits>
template<typename T1,typename T2>
typename std::common_type<T1,T2>::type max(T1 num1,T2 num2){return num1<num2?num2:num1;
}
template<typename T1,typename T2>
typename std::common_type<T1,T2>::type min(T1 num1,T2 num2){return num1>num2?num2:num1;
}
int main(){std::cin.tie(nullptr)->sync_with_stdio(false);constexpr int MAX_N = 1e2+5,INF = 0x3f3f3f3f;int g[MAX_N][MAX_N];int dist[MAX_N];memset(g,0x3f,sizeof g);bool vis[MAX_N] = {false};int n,m;std::cin >> n >> m;while(m--){int x,y,w;std::cin >> x >> y >> w;g[x][y]=g[y][x]=min(g[y][x],w);}auto prim = [&]()->int{memset(dist,0x3f,sizeof dist);dist[1] = 0;int ans = 0;for(int i = 0;i<n;++i){int t = -1;for(int j = 1;j<=n;++j){if(!vis[j]&&(t==-1||dist[t]>dist[j])) t = j;}if(dist[t]==INF) return INF;ans = max(ans,dist[t]);vis[t] = true;for(int j = 1;j<=n;++j) dist[j]=min(dist[j],g[t][j]);}return ans;};std::cout << n-1 << ' ' << prim() << '\n';return 0;
} 

问题 F: 最小生成树-联络员

 

参考题解:

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>constexpr int MAX_N = 2e3+5,MAX_M = 1e4+5,INF = 0x3f3f3f3f;struct edge{int x,y,w;bool operator < (const edge& W){return w<W.w;}edge(int _x,int _y,int _w):x(_x),y(_y),w(_w){}
};
std::vector<edge> edges;
int fa[MAX_N];
int main(){std::cin.tie(nullptr)->sync_with_stdio(false);int n,m;std::cin >> n >> m;for(int i = 1;i<=n;++i) fa[i] = i;using Find = std::function<int(int)>;Find find = [&](int x){if(x!=fa[x]) fa[x] = find(fa[x]);return fa[x];};int ans = 0;while(m--){int t,x,y,w;std::cin >> t >> x >> y >> w;if(t==1){ans+=w;fa[find(x)] = find(y);}else{edges.emplace_back(x,y,w);}}auto kruskal = [&](){std::sort(edges.begin(),edges.end());for(int i = 0;i<edges.size();++i){int fx = find(edges[i].x),fy = find(edges[i].y),w = edges[i].w;if(fx!=fy){fa[fx] = fy;ans+=w;}}};kruskal();std::cout << ans << '\n';return 0;
}

问题 G: 最小生成树-连接格点

 

参考题解:

#include <iostream>
#include <functional>constexpr int MAX_N = 1e3+5;int fa[MAX_N*MAX_N];int main(){std::cin.tie(nullptr)->sync_with_stdio(false);using Find = std::function<int(int)>;Find find = [&](int x)->int{if(x!=fa[x]) fa[x] = find(fa[x]);return fa[x];};int n,m;std::cin >> n >> m;for(int i = 0;i<=n*m;++i) fa[i] = i;int x1,y1,x2,y2;while(std::cin >> x1 >> y1 >> x2 >> y2){fa[find((x1-1)*m+y1)] = find((x2-1)*m+y2);}int ans = 0;auto kruskal = [&]()->void{for(int i = 1;i<n;++i){for(int j = 1;j<=m;++j){int dx = find((i-1)*m+j),dy = find(i*m+j);if(dx!=dy){++ans;fa[dx] = dy;}}}for(int i = 1;i<=n;++i){for(int j = 1;j<m;++j){int dx = find((i-1)*m+j),dy = find((i-1)*m+j+1);if(dx!=dy){ans+=2;fa[dx] = dy;}}}};kruskal();std::cout << ans << '\n';return 0;
}

问题 H: 最小生成树-最短网络

 

参考题解:

#include <iostream>
#include <cstring>
#include <type_traits>
template<typename T1,typename T2>
typename std::common_type<T1,T2>::type min(T1 num1,T2 num2){return num1>num2?num2:num1;
}
int main(){std::cin.tie(nullptr)->sync_with_stdio(false);constexpr int MAX_N = 1e2+5,INF = 0x3f3f3f3f;int g[MAX_N][MAX_N];int dist[MAX_N];bool vis[MAX_N] {};int n;std::cin >> n;for(int i = 1;i<=n;++i){for(int j = 1;j<=n;++j){std::cin >> g[i][j];}}auto prim = [&]()->int{memset(dist,0x3f,sizeof dist);int res = 0;dist[1] = 0;for(int i = 0;i<n;++i){int t = -1;for(int j = 1;j<=n;++j){if(!vis[j]&&(t==-1||dist[j]<dist[t])) t = j;}if(dist[t]==INF) return INF;vis[t] = true;res+=dist[t];for(int j = 1;j<=n;++j) dist[j]=min(dist[j],g[t][j]);}return res;};std::cout << prim() << '\n';return 0;
}

问题 I: 最小生成树-最优布线问题

 

参考题解:

#include <iostream>
#include <cstring>
#include <type_traits>
template<typename T1,typename T2>
typename std::common_type<T1,T2>::type min(T1 num1,T2 num2){return num1>num2?num2:num1;
}
int main(){std::cin.tie(nullptr)->sync_with_stdio(false);constexpr int MAX_N = 1e2+5,INF = 0x3f3f3f3f;int g[MAX_N][MAX_N];int dist[MAX_N];bool vis[MAX_N] {};int n;std::cin >> n;for(int i = 1;i<=n;++i){for(int j = 1;j<=n;++j){std::cin >> g[i][j];}}auto prim = [&]()->int{memset(dist,0x3f,sizeof dist);int res = 0;dist[1] = 0;for(int i = 0;i<n;++i){int t = -1;for(int j = 1;j<=n;++j){if(!vis[j]&&(t==-1||dist[j]<dist[t])) t = j;}if(dist[t]==INF) return INF;vis[t] = true;res+=dist[t];for(int j = 1;j<=n;++j) dist[j]=min(dist[j],g[t][j]);}return res;};std::cout << prim() << '\n';return 0;
}

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

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

相关文章

盲人社会适应性训练:打开生活的新篇章

在现代社会的快节奏中&#xff0c;每一位成员都在寻求更好的方式来适应环境&#xff0c;对于盲人群体而言&#xff0c;这种适应性尤为关键。盲人社会适应性训练作为一个旨在提升盲人生活质量和独立性的系统性过程&#xff0c;正逐步受到广泛关注。在这一过程中&#xff0c;一款…

轻量SEO分析报告程序网站已开心去授权

轻量SEO分析报告程序网站已开心去授权&#xff0c;可以让你生成有洞察力的、 简洁的、易于理解的SEO报告&#xff0c;帮助你的网页排名和表现更好 网站源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/

如何通过软件IIC使用MPU6050陀螺仪

目录 1. MPU6050简介 2. MPU6050参数 3. MPU6050硬件电路 4. 代码编写 4.1 MPU6050写寄存器 4.2 MPU6050读寄存器 4.3 初始化 4.4 MPU6050获取ID号 4.5 MPU6050获取数据 1. MPU6050简介 MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的…

2024-05-23 vscode + clang + clangd 解锁 modules

点击 <C 语言编程核心突破> 快速C语言入门 vscode clang clangd 解锁 modules 前言一、准备二、使用备注: 总结 前言 要解决问题: 昨天解锁VS使用modules, 但是不完美, 没有代码提示和补全了, 今天用 vscode clang clangd 解锁 modules, 同时还有代码补全及提示. …

js中的 map 方法遍历

map方法// map 方法不改变原本的数组 所以要将map之后的值赋值给一个新的变量 // ...item 的作用是 // 将调用 map 函数的数组里的所有数据 都复制到新的&#xff0c;接收map之后的数组中 // 在此基础上 再覆盖或者添加新的数据&#xff0c;如 outpatient 和 recommended 属性/…

Defog发布Llama-3-SQLCoder-8B,文本转SQL模型,性能比肩GPT-4,准确率超90%,消费级硬件可运行

前言 在计算语言学领域&#xff0c;将自然语言转化为可执行的SQL查询是一个重要的研究方向。这对于让那些没有编程或SQL语法知识的用户也能轻松访问数据库信息至关重要。Defog团队近日发布了基于Llama-3的SQLCoder-8B模型&#xff0c;它在文本转SQL模型领域取得了显著突破&…

2024.05.23 学习记录

1、 react hooks 面经复习 2、xiaolin coding 计算机网络 复习 3、组件库 subMenu、test测试、tabs组件初步开发完成 4、代码随想录刷题&#xff1a;动态规划 01背包 all

MyBatisPlus标准分页功能制作,以及设置分页拦截器,selectPage(new Page<>(current,size),null)

目录 1、设置分页拦截器 2、创建数据库及表 3、pom.xml 4、添加MP的相关配置信息 application.yml 5、根据数据库表创建实体类 User 6、创建 UserDao 接口 7、编写引导类 8、编写测试类 9、Run的运行结果 1、设置分页拦截器 package com.example.config; import com.baomidou.m…

Linux: network: send 失败的时候要不要close socket?

最近遇到一个例子&#xff0c;说有zerowindow出现&#xff1b;出现的原因是接收方的CPU被其他程序吃光&#xff0c;导致socket的read函数处理非常慢。说明接收端的接收缓存不够用。发送端自然而然的要停止发送。 但是如果在接收方的recv buff&#xff0c;以及发送方的send buf…

探索移动云:我的ES与Kibana之旅

目录 引言&#xff1a; 如何免费体验移动云产品 登录并完成实名认证 选择试用ECS云主机 安全组配置 安装Elasticsearch和Kibana 安装Elasticsearch ​编辑安装kibana 测试结果 使用感觉 引言&#xff1a; 移动云技术产品的发展已经取得了巨大的进步。云数融合、A1、大…

解决vite打包只生成了一个css和js文件问题

文章目录 1. 打包遇到的问题2. 问题原因及修改3. 调整后再次打包&#x1f197; 1. 打包遇到的问题 今天整了一个项目&#xff0c;试了下打包&#xff0c;发下打包后只生成了一个css文件&#xff0c;和一个js文件&#xff0c; 这样肯定是不行的&#xff0c;因为这样这个文件的包…

Windows:iHasher-v0.2安装报错Windows 功能 .NET Framework 3.5

一、情景描述 我们从MSDN下载了镜像文件&#xff0c;一般要验证下载文件的HASH值是否与MSDN上发布的一致&#xff0c;确保传出过程中iso文件没有损坏。 MSDN地址&#xff1a;https://msdn.itellyou.cn/ 我从MSDN下载了Hasher工具&#xff0c;进行校验。 但是&#xff0c;安装…

智慧社区管理系统:打造便捷、安全、和谐的新型社区生态

项目背景 在信息化、智能化浪潮席卷全球的今天&#xff0c;人们对于生活品质的需求日益提升&#xff0c;期待居住环境能与科技深度融合&#xff0c;实现高效、舒适、安全的生活体验。在此背景下&#xff0c;智慧社区管理系统应运而生&#xff0c;旨在借助现代信息技术手段&…

[机缘参悟-185] - 《道家-水木然人间清醒1》读书笔记 - 真相本质 -8- 认知觉醒 - 逻辑谬误、认知偏差:幸存者偏差

目录 前言&#xff1a; 一、幸存者偏差 二、幸存者偏差在现实中的应用 第一个故事&#xff1a; 第二个故事&#xff1a; 三、生活中的幸存者偏差 四、迷恋成功者经验的原因&#xff1a;鸡汤、幻想、传奇、希望 备注&#xff1a; 前言&#xff1a; 幸存者偏差&#xff0…

从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)

你是否被K8S的强大而吸引&#xff0c;我相信一部分人是被那复杂的配置和各种专业知识而劝退&#xff0c;应该还有一部分人是因为K8S太吃资源而放手&#xff01; 这里介绍一款平替工具PasteSpider&#xff0c;PasteSpider是一款使用c#编写的linux容器部署工具(使用PasteSpider和…

k8s集群的声明式管理资源

一 声明式管理方法 1 适合于对资源的修改操作&#xff08;陈述式方式修改资源非常不方便&#xff09; 2 声明式资源管理方法依赖于yaml资源配置清单文件对资源进行管理 资源配置清单文件有两种格式&#xff1a;yaml&#xff08;人性化&#xff0c;易读&#xff09;&#xff…

【智能算法应用】遗传算法求解车间布局优化问题

目录 1.问题背景2.车间布局数学模型3.算法过程4.结果展示5.参考文献6.代码获取 1.问题背景 工厂设施布置的规划一直是工业工程领域不断研究和探索的内容&#xff0c; 其中最具代表性之一的是系统布置设计( system layout planning&#xff0c; SLP) 方法。作为一种经典且有效的…

flink程序本地运行报: A JNI error has occurred和java.lang.NoClassDefFoundError

1.问题描述 在idea中运行flink job程序出现如下错误&#xff1a; Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/flink/api/common/io/FileInputFormat …

接口自动化基础

1、接口自动化测试 接口自动化&#xff1a;使用工具或代码代替人对接口进行测试的技术。 测试目的&#xff1a;防止开发修改代码时引入新的问题。 l测试时机&#xff1a; 开发进行系统测试转测前&#xff0c;可以先进行接口自动化脚本的编写。 开发进行系统测试转测后&…

单片机通信协议(1):SPI简介

关于SPI SPI&#xff08;串行外设接口&#xff09;是板载设备间通信接口之一。它是由摩托罗拉公司&#xff08;飞思卡尔半导体&#xff09;推出的。由于其简单性和通用性&#xff0c;它被纳入各种外围设备中&#xff0c;并与飞利浦I2C总线并列。 SPI的三线或四线信号数量比IIC…