图论入门题题解

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

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

          所属专栏:刷题_脑子不好的小菜鸟的博客-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.hqwc.cn/news/521846.html

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

相关文章

智慧文旅|AI数字人导览:让旅游体验不再局限于传统

AI数字人导览作为一种创新的展示方式&#xff0c;已经逐渐成为了VR全景领域的一大亮点&#xff0c;不仅可以很好的嵌入在VR全景中&#xff0c;更是能够随时随地为观众提供一种声情并茂的讲解介绍&#xff0c;结合VR场景的沉浸式体验&#xff0c;让观众仿佛置身于真实场景之中&a…

5个实用的PyCharm插件

大家好&#xff0c;本文向大家推荐五个顶级插件&#xff0c;帮助开发人员提升PyCharm工作流程&#xff0c;将生产力飞升到新高度。 1.CodiumAI 安装链接&#xff1a;https://plugins.jetbrains.com/plugin/21206-codiumate--code-test-and-review-with-confidence--by-codium…

中医把脉笔记

目录 寸关尺对应的五脏六腑自己给自己把脉参考文章 寸关尺对应的五脏六腑 自己给自己把脉 up主道道总是睡不着的把脉教学视频 用中指按住小骨头下面一点&#xff0c;这是关脉&#xff0c;左手的关脉对应肝脏。 参考文章 中医脉诊动图&#xff08;建议收藏&#xff09; 最全…

linux下访问MySQL,检索数据库库表字段报错 Public Key Retrieval is not allowed(不允许公钥检索)

报错如下&#xff1a; 解决办法 在连接数据库的配置文件中加上&allowPublicKeyRetrievaltrue语句&#xff0c;如下&#xff1a; jdbc:mysql://localhost:3306?useUnicodetrue&zeroDateTimeBehaviorconvertToNull&autoReconnecttrue&characterEncodingutf-8&…

如何 借助 AI + bat,1分钟内建立100个自定义文件和文件夹?

01 你好&#xff0c;我是云桃桃。 最近&#xff0c;我在写web系列的知识&#xff0c;做的过程中遇到过不少问题。今天&#xff0c;就来说说&#xff0c;我解决的一个批量新建文件/文件夹的问题。 事情是这样的。首先&#xff0c;我的大纲基本在幕布里已经弄好了&#xff0c;…

Vue2 基础二常用特性

代码下载 表单操作 基于Vue的表单操作 input 单行文本textarea 多行文本select 下拉多选&#xff0c;multiple属性实现多选&#xff0c;多选时对应的 data 中的数据也要定义成数组radio 单选框checkbox 多选框&#xff0c;data 中的数据要定义成数组&#xff0c;否则无法实现…

一文彻底搞懂死锁

文章目录 1. 什么是死锁2. 死锁产生的条件3. 死锁产生的原因4. 死锁解决的方法4.1 死锁防止4.1.1 破坏互斥条件4.1.2 破坏占有和等待条件4.1.3 破坏不剥夺条件4.1.4 破坏循环等待条件 4.2 死锁避免4.2.1 安全状态4.2.2单个资源的银行家算法4.2.3 多个资源的银行家算法 4.3 死锁…

弱电综合布线:连接现代生活的纽带

在当今信息化快速发展的时代&#xff0c;弱电网络布线作为信息传输的重要基础设施&#xff0c;其作用日益凸显。它不仅保障了数据的高效流通&#xff0c;还确保了通信的稳定性。从商业大厦到教育机构&#xff0c;从政府机关到医院急救中心&#xff0c;再到我们居住的社区&#…

BI分析案例:企业如何利用BI工具开展经营分析工作?

广义上来说&#xff0c;经营分析是对商业行为的复盘&#xff0c;评价商业行为的关键是经济或财务指标&#xff0c;因此可以理解为经营分析是财务分析的延伸。同时经营意味着管理&#xff0c;对内部管能力的分析也是至关重要的。商业行为受市场环境影响&#xff0c;对市场环境的…

ES分布式搜索-IK分词器

ES分词器-IK 1、为什么使用分词器&#xff1f; es在创建倒排索引时需要对文档分词&#xff1b;在搜索时&#xff0c;需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试&#xff1a; GET /_analyze {"analyzer": "…

面试经典150题——环形链表

Suffering, for the weak is the tomb of death, and for the strong is the soil of germinal ambition.​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 这个题目就是判断一个链表有没有环&#xff0c;其实我们之讲过一个题目&#xff0c;就实现了判断链表有没有环的步骤&a…

【python进阶篇】面向对象编程(1)

面向对象编程——Object Oriented Programming&#xff0c;简称OOP&#xff0c;是一种程序设计思想。OOP把对象作为程序的基本单元&#xff0c;一个对象包含了数据和操作数据的函数。 在Python中&#xff0c;所有数据类型都可以视为对象&#xff0c;当然也可以自定义对象。自定…