图论入门题题解

✨欢迎来到脑子不好的小菜鸟的文章✨

      🎈创作不易,麻烦点点赞哦🎈

          所属专栏:刷题_脑子不好的小菜鸟的博客-CSDN博客

          我的主页:脑子不好的小菜鸟

          文章特点:关键点和步骤讲解放在

          代码相应位置

拓扑排序 / 家谱树
https://vjudge.net/contest/613618#problem/A


//拓扑排序:找到入度为0的点,将其写入答案,再删去其箭头,再继续找入度为0的点,循环往复vector<int>edeg[101];
int n, deg[101] = { 0 };//入度
void init()//建图
{cin >> n;int i, val;for (i = 1; i <= n; i++){while (cin >> val && val != 0){edeg[i].push_back(val);deg[val]++;}}
}void toposort()//拓扑排序
{int i;queue<int> que;for (i = 1; i <= n; i++){if (deg[i] == 0){cout << i << ' ';que.push(i);}}while (!que.empty()){int t = que.front();que.pop();for (int i : edeg[t])//相当于i表示edeg[t]的第一个元素,进行一次循环后就是第二个元素,循环往复{deg[i]--;if (deg[i] == 0){cout << i << ' ';que.push(i);//push的原因:可能i(也就是edeg[t])还有箭头指向其他的数,也就是后面辈分比它小的,要通过i来找比它辈分小的}}}
}int main()
{init();//建图toposort();//拓扑排序return 0;
}

P3371 【模板】单源最短路径(弱化版)
https://www.luogu.com.cn/problem/P3371

///*法一:邻接矩阵*/
占的空间较多,时间复杂度较大,不适合/*法二:结构体,堆优化*/
//要一个结构体,存一个点相关的东西(to, wei, next)(终点, 权值, 下一个儿子)
//cnt:结构体下标
//head[MAX]:head[i]:查找i点的第一个儿子
//pos:将被标记的值
//ans[MAX]:最短距离
//visit[MAX]:是否被标记过//题解:https://www.luogu.com.cn/article/oswxjzrl
#include <iostream>#include <climits>
using namespace std;
const int MAX = 1e6;int cnt;//结构体下标int visit[MAX];//标记int n, m, s;int head[MAX];//存放儿子int ans[MAX];//放到起点的最短距离
struct EDGE
{int wei;//权值int to;//目的地int next;//下一个儿子
}edge[MAX];
void add(int u, int v, int w){cnt++;edge[cnt].wei = w;edge[cnt].to = v;edge[cnt].next = head[u];//将下一个儿子记录head[u] = cnt;//更新第一个儿子
}
int main(){cin >> n >> m >> s;int i;//初始化ansfor (i = 1; i <= n; i++)ans[i] = INT_MAX;ans[s] = 0;int u, v, w;for (i = 1; i <= m; i++){cin >> u >> v >> w;add(u, v, w);}int pos = s;//初始化pos为swhile (visit[pos] == 0){int minn = INT_MAX;//注意更新visit[pos] = 1;//标记//更新儿子的最短路径for (i = head[pos]; i != 0; i = edge[i].next){if (visit[edge[i].to] == 0 && ans[edge[i].to] > ans[pos] + edge[i].wei)ans[edge[i].to] = ans[pos] + edge[i].wei;}//找最短路径for (i = 1; i <= n; i++){if (visit[i] == 0 && ans[i] < minn){minn = ans[i];pos = i;}}}for (i = 1; i <= n; i++)cout << ans[i] << ' ';cout << endl;return 0;
}

P4779 【模板】单源最短路径(标准版)
https://www.luogu.com.cn/problem/P4779

注意:该题用上一题的代码会超时,因此要用堆优化,也就是优先队列

//友情提示:正权图  请  使用dijkstra算法,   负权图  请  使用SPFA算法//弱化版的代码超时---->要用堆优化
/*
核心:priority_queue< pair<int,int> > 用优先队列来取最近的点,就不用遍历找点了在pq中,是按pair的第一个元素(first)由大到小排序的,所以pair<距离,点号>,注意因为要的是最小值,所以距离要存负值
其实距离是纯纯的工具人,我们只是需要它来维持点的排序每次取队首h,取出的就是dis最短的点
还要注意:
如果这个点的dis不等于h的dis,说明这个点在入队之后被更新了,那么我们就不用这个点了,直接continue;
因为后面会有个h2点比h1的dis更小,用h1更新就没有意义了
*///使用优先队列,注意:优先队列是从大到小排列,所以存进去应该存负数C代码:
#include <queue>
/*堆优化:利用优先队列,降低复杂度,直接排序,注意优先队列是由大到小排列的,因此距离是负数 */
#include <climits>
#include <iostream>using namespace std;const int MAX = 1e6;
int n, m, s;
int ans[MAX];
int cnt;
int head[MAX];
int visit[MAX];struct EDGE
{int to;int next;int wei;
}edge[MAX];void add(int u, int v, int w)
{cnt++;edge[cnt].wei = w;edge[cnt].to = v;edge[cnt].next = head[u];head[u] = cnt;
}int main()
{int i;int u, v, w;cin >> n >> m >> s;for (i = 1; i <= n; i++)ans[i] = INT_MAX;ans[s] = 0;for (i = 1; i <= m; i++){cin >> u >> v >> w;add(u, v, w);}priority_queue<pair<int, int> >que;//距离,点que.push({0, s});while (!que.empty()){int qh = que.top().first;int h = que.top().second;que.pop();/*记得pop()!!!!!!!!!*/if (visit[h] == 0){visit[h] = 1;for (i = head[h]; i != 0; i = edge[i].next)//不断找下一个儿子,直到找完{if (ans[edge[i].to] > ans[h] + edge[i].wei){ans[edge[i].to] = ans[h] + edge[i].wei;if (visit[edge[i].to] == 0)que.push({ -ans[edge[i].to], edge[i].to });}}}}for (i = 1; i <= n; i++)cout << ans[i] << ' ';cout << endl;return 0;
}

B3647 【模板】Floyd
https://www.luogu.com.cn/problem/B3647 

//floyd算法
//要注意中转点,可以直接i到j,也可以i->k,k->j,因此要比较两个数据的大小,最后表中的是最短路径
//注意是无向图#include <climits>int main()
{int n, m, i, j, u, v, w;long long board[105][105] = { 0 };//存最短路径cin >> n >> m;for (i = 1; i <= n; i++){for (j = 1; j <= n; j++){if (i == j)board[i][j] = 0;elseboard[i][j] = INT_MAX;}}for (i = 1; i <= m; i++){cin >> u >> v >> w;if (w < board[u][v])board[u][v] = w;if (w < board[v][u])board[v][u] = w;}int k;           for (k = 1; k <= n; k++)//把k当中转点,注意是放在i,j循环的外面{for (i = 1; i <= n; i++)//行,列{if (i == k)continue;for (j = 1; j <= n; j++){if (j == k)continue;if (i == j)continue;if (board[i][k] != INT_MAX && board[k][j] != INT_MAX)board[i][j] = min(board[i][j], board[i][k] + board[k][j]);}}}for (i = 1; i <= n; i++){for (j = 1; j <= n; j++){cout << board[i][j] << ' ';}cout << endl;}return 0;
}

恭喜你啦,今天又进步了一点点~

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

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

相关文章

【开源】JAVA+Vue.js实现高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

win11中微软商店如何使用微信支付?microsoft store支付教程

Microsoft Store是由微软公司提供的一个数字分发平台&#xff0c;用于购买和下载Windows操作系统及其相关应用、游戏、音乐、电影、电视节目和其他数字内容。该平台最初是作为Windows 8的一部分引入的&#xff0c;后来也适用于Windows 10和其他Microsoft平台。 以下是Microsof…

讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so

1.需求 最近linux下的Qt项目中要连接oracle数据库&#xff0c;用户需要我们访问他们的oracle数据库&#xff0c;查询数据 2.遇到的问题 qt连接oracle数据库需要oracle的驱动库libqsqloci.so插件&#xff0c;需要编译下&#xff0c;之前没有编译过&#xff0c;看了网上的…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

HTML—常用标签

常用标签&#xff1a; 标题标签&#xff1a;<h1></h1>......<h6></h6>段落标签&#xff1a;<p></p>换行标签&#xff1a;<br/>列表&#xff1a;无序列表<ul><li></li></ul> 有序列表<ol>&…

人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介 k-最近邻算法&#xff0c;也称为 kNN 或 k-NN&#xff0c;是一种非参数、有监督的学习分类器&#xff0c;它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题&#xff0c;但它通常用作分类算法&#xff0c;假设可以在彼此附近找到相似点。 对于分类…

【中间件】RabbitMQ入门

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 MQ的优劣&#xff1a; 优势 应用解耦&#xff1a;提升了系统容错性和可维护性异步提速&#xff1a;提升用户体验和系统吞吐量消峰填谷&#xff1…

【LeetCode 算法专题突破】---二分查找(⭐⭐⭐)

前言 我在算法题目的海洋中畅游已久&#xff0c;也曾在算法竞赛中荣获佳绩。然而&#xff0c;我发现自己对于算法的学习&#xff0c;还缺乏一个系统性的总结和归类。尽管我已经涉猎过不少算法类型&#xff0c;但心中仍旧觉得有所欠缺&#xff0c;未能形成完整的算法体系。 因…

问题解决 | vscode无法连接服务器而ssh和sftp可以

解决步骤 进入家目录删除.vscode-server rm -rf .vscode-server 然后再次用vscode连接服务器时&#xff0c;会重新安装&#xff0c;这时可能报出一些缺少依赖的错 需要联系管理员安装相关依赖&#xff0c;比如 sudo apt-get install libstdc6 至此问题解决

【数据结构】单链表的层层实现!! !

关注小庄 顿顿解馋(●’◡’●) 上篇回顾 我们上篇学习了本质为数组的数据结构—顺序表&#xff0c;顺序表支持下标随机访问而且高速缓存命中率高&#xff0c;然而可能造成空间的浪费&#xff0c;同时增加数据时多次移动会造成效率低下&#xff0c;那有什么解决之法呢&#xff…

打造经典游戏:HTML5与CSS3实现俄罗斯方块

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

机器学习开源分子生成系列(1)-DeepFrag的本地部署及使用

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …进入 文章目录 前言一、DeepFrag是什么&#xff1f;二、conda中安装DeepFrag CLI环境1. 创建环境并激活2. 下载pre-trained model3. DeepFrag CLI 使用方法必需参数&#xff1a;可选参数&#xff1a; 4. DeepFrag CLI 使用…

带摄像头的 AirPods,苹果会怎么做出来?

苹果对智能产品的设计&#xff0c;正在放飞自我。 根爆料&#xff0c;苹果在「未来设备」的规划里&#xff0c;有两个大胆的想法&#xff1a; 一是带有屏幕的 HomePod 正在研发中&#xff0c;当中将集成 Apple TV、FaceTime 等重多功能&#xff1b;二是配备摄像头的 AirPod…

201909青少年软件编程(Scratch)等级考试试卷(三级)

青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;三级&#xff09;2019年9月 第1题&#xff1a;【 单选题】 执行下面的脚本后&#xff0c;变量“分数”的值是多少&#xff1f;&#xff08;&#xff09; A:5 B:6 C:10 D:25 【正确答案】: C 【试题…

[java基础揉碎]super关键字

super关键字: 基本介绍 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super给编程带来的便利/细节 1.调用父类的构造器的好处(分工明确&#xff0c;父类属性由父类初始化&#xff0c;子类的属性由子类初始化) 2.当子类中有和父类中的成员(属性和方法)重…

新零售SaaS架构:订单履约系统架构设计(万字图文总结)

什么是订单履约系统&#xff1f; 订单履约系统用来管理从接收客户订单到将商品送达客户手中的全过程。 它连接了上游交易&#xff08;客户在销售平台下单环&#xff09;和下游仓储配送&#xff08;如库存管理、物流配送&#xff09;&#xff0c;确保信息流顺畅、操作协同&…

UDP实现文件的发送、UDP实现全双工的聊天、TCP通信协议

我要成为嵌入式高手之3月7日Linux高编第十七天&#xff01;&#xff01; ———————————————————————————— 回顾 重要程序 1、UDP实现文件的发送 发端&#xff1a; #include "head.h"int main(void) {int sockfd 0;struct sockaddr_i…

141 Linux 系统编程18 ,线程,线程实现原理,ps –Lf 进程 查看

一 线程概念 什么是线程 LWP&#xff1a;light weight process 轻量级的进程&#xff0c;本质仍是进程(在Linux环境下) 进程&#xff1a;独立地址空间&#xff0c;拥有PCB 线程&#xff1a;有独立的PCB&#xff0c;但没有独立的地址空间(共享) 区别&#xff1a;在于是否共…

一周学会Django5 Python Web开发-Django5内置模板引擎-模板上下文变量

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计32条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

瑞芯微 | I2S-音频基础 -1

最近调试音频驱动&#xff0c;顺便整理学习了一下i2s、alsa相关知识&#xff0c;整理成了几篇文章&#xff0c;后续会陆续更新。 喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。 1. 音频常用术语 名称含义ADC&#xff08;Analog to Digit Conversion&#xff09;模拟信号转换…