图论(基础)

知识:

顶点,边 | 权,度数

1.图的种类:

有向图 | 无向图

有环 | 无环

联通性

基础1:图的存储(主要是邻接矩阵和邻接表)

例一:B3643 图的存储 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>using namespace std;int n, m, d[1010];
bool edges[1010][1010];int main()
{cin >> n >> m;for(int i = 1; i <= m; i ++ ){int u, v;cin >> u >> v;edges[u][v] = true;edges[v][u] = true;}for(int i = 1; i <= n; i ++ ){for(int j = 1; j <= n; j ++ ){if(edges[i][j]) {cout << "1 ";d[i] ++;}else cout << "0 "; }cout << endl;}for(int i = 1; i <= n; i ++ ){cout << d[i] << ' ';for(int j = 1; j <= n; j ++ ){if(edges[i][j]) cout << j << ' ';}cout << endl;}return 0;
}

例二:B3613 图的存储与出边的排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

该代码须加上快读快写

#include <iostream>
#include <set>
using namespace std;const int N = 5e5 + 10;
int n, m;
set<int> s[N];int main()
{int t;cin >> t;while(t -- ){cin >> n >> m;for(int i = 0; i < m; i ++ ){int a, b;cin >> a >> b;s[a].insert(b);}int j = 0;for(int i = 1; i <= n; i ++ ){for(auto it = s[i].begin(); it != s[i].end(); it ++ )cout << *it << ' ';cout << endl;}}return 0;
}

图的遍历:通常是bfs()、dfs()

复习一下模板活动 - AcWing 活动 - AcWing

例一:P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

因为是找最大值dfs,用了反向建边提高效率,用一个大值去标记多个小值

#include <iostream>
#include <cstring>
using namespace std;const int N = 1e5 + 10, M = 2 * N;
int n, m;
int e[N], ne[N], h[N], idx;
int res[N];void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}void dfs(int u, int maxn)
{res[u] = max(maxn, res[u]);for(int i = h[u]; i != -1; i = ne[i]){int j = e[i];if(!res[j]) dfs(j, maxn);}
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);while(m -- ){int u, v;cin >> u >> v;add(v, u);}for(int i = n; i >= 1; i -- ){//反向建边+遍历 有利于找最大值的效率// 如果是第一次被遍历到一定找到了遍历最大的值//已经被标记过最大值的说明他们下边的最大值也被标记过了if(res[i]) continue;dfs(i, i);}for(int i = 1; i <= n; i ++ ){cout << res[i] << ' ';}return 0;
}

例二:活动 - AcWing 图的层次

肯定要用bfs啦

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;const int N = 1e5 + 10;
int h[N], e[N], ne[N], idx;
int d[N];
int n,m;
queue<int> q;void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}int bfs()
{memset(d, -1, sizeof d);d[1] = 0;q.push(1);while(q.size()){auto t = q.front();q.pop();for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(d[j] == -1){d[j] = d[t] + 1;q.push(j);}}}return d[n];
}int main(){cin >> n >> m;memset(h, -1, sizeof h);for(int i = 0; i < m; i++ ){int a, b;cin >> a >> b;add(a, b);}cout << bfs() << endl;return 0;
}

例三:P5318 【深基18.例3】查找文献 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

分别用dfs和bfs输出一遍。唯一的难点在于怎么做到 "如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序)。" 问题不大,排个序就行。

注意用邻接表存图(s存边先处理一下,即排序) 然后处理e[i][]表示i点连接的点

然后就是喜闻乐见的dfs递归一下,bfs一下

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;const int N = 1e5 + 10;
struct edges
{int a, b;
};
vector<int> e[N]; // e是邻接表,用来遍历
vector<edges> s; // 用来存边
int n, m;
bool st1[N], st2[N];
queue<int> q;bool cmp(edges x, edges y)
{//按照每条边终点从小到大排,终点相同的起点按从小到大排if(x.b == y.b) return x.a < y.a;else return x.b < y.b;
}void bfs()
{q.push(1);st2[1] = true;cout << '1' << ' ';while(q.size()){int t = q.front();q.pop();for(int i = 0; i < e[t].size(); i ++ ){int j = s[e[t][i]].b;if(!st2[j]){st2[j] = true;cout << j << ' ';q.push(j);}}}
}
void dfs(int u)
{st1[u] = true;cout << u << ' ';for(int i = 0; i < e[u].size(); i ++ ){int j = s[e[u][i]].b;if(!st1[j]) dfs(j);}
}int main()
{cin >> n >> m;for(int i = 0; i < m; i ++ ){int a, b;cin >> a >> b;s.push_back((edges){a, b});}sort(s.begin(), s.end(), cmp);//m条边放到e中 for(int i = 0; i < m; i ++ ){e[s[i].a].push_back(i); // e存某个点到其他点的边的编号}// for(int i = 0; i < m; i ++ )// {//     cout << s[i].a << ':' << s[i].b << endl;// }dfs(1);puts("");bfs();return 0;
}

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

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

相关文章

如何实现24/7客户服务自动化?建设智能客服知识库

客户自助服务是指用户通过企业或者第三方建立的网络平台或者终端&#xff0c;实现相关的自定义处理。实现客户服务自动化&#xff0c;对提高客户满意度、维持客户关系至关重要。客户服务自动化可以帮助企业以更快的速度和更高的效率来满足客户的售后服务要求&#xff0c;以进一…

C++的引用和函数重载

左值的引用(reference) 如果想要实现两个数据的交换&#xff0c;进行值传递时&#xff0c;不能交换实参&#xff0c;使用地址传递会交换实参(额外开辟空间) 概念 引用其实就是给变量起了一个别名 C是对C的一个重要的扩充 定义 数据类型 &引用名 目标名 引用的注意事项…

分享两道Java面试的算法上机题目(后续会持续补充更多)

所有题目参考答案均是小编自己想法&#xff0c;仅供参考&#xff0c;解法很多&#xff0c;大可不必局限&#xff0c;有更优解的大神无解&#xff0c;可评论或私聊博主指正&#xff01; 题目1 找大串&#xff0c;给定一个字符串其中包含任意组连续字符&#xff0c;我们把超过3个…

常见的移动端布局

流式布局&#xff08;百分比布局&#xff09; 使用百分比、相对单位&#xff08;如 em、rem&#xff09;等来设置元素的宽度&#xff0c;使页面元素根据视口大小的变化进行调整。这种方法可以实现基本的自适应效果&#xff0c;但可能在不同设备上显示不一致。 <!DOCTYPE ht…

Enable Secure boot on software

User Guide&#xff1a; Secure Boot V1Secure Boot V2espsecure.py Please follow these steps: 1、Query the chip version esptool.py chip_idThe V1.0 version chip only supports Secure boot V1 The V3.0 or later version chip support Secure boot V2 2、You need…

如何把一段str字符转换成字典?

可以使用Python内置的eval()函数将字符串转换为字典。不过需要注意使用eval()函数时需要保证输入的字符串格式正确&#xff0c;否则可能会出现异常&#xff0c;甚至安全隐患。以下是一个使用eval()函数将字符串转换为字典的例子&#xff1a; s "{key1: value1, key2: va…

find命令的用法

文章目录 [TOC](文章目录) 前言一、根据文件名来搜索(-name)二、根据文件类型来搜索 (-type)三、根据文件大小来搜索 (-size)四、根据目录层级来搜索五、同时执行多步操作六、总结 前言 find命令主要功能是根据文件的属性, 如&#xff1a;文件名, 文件类型, 文件大小, 文件的目…

成集云 | 畅捷通T+cloud连接器自动同步财务费用单至畅捷通 | 解决方案

源系统成集云目标系统 方案介绍 财务管理作为企业管理中重要的组成部分&#xff0c;在企业的发展和成长中扮演着重要角色&#xff0c;成集云以钉钉费用单OA审批与畅捷通TCloud系统为例&#xff0c;与钉钉连接器深度融合&#xff0c;通过数据处理和字段匹配实现了费用…

1558 Euro Efficiency (ZOJ)

看了下别人的写法&#xff0c;跟我写的都不一样……也不知道我的做法有没有疏漏&#xff0c;但可以AC。 #include <cstdio> #include <set> #include <algorithm> const int maxN 101; const int INF 99999999;int n, t, maxx, sum; std::set<int> …

【C51 GPIO的原理和内部结构】

51单片机项目基础篇 中篇&#xff1a;介绍GPIO1、认识GPIO2、GPIO 结构框图与工作原理2.1、P0端口结构框图与工作原理2.1.1、剖析组成 P0 口的每个单元的作用2.1.2、 P0 口做为 I/O 口及地址/数据总线使用时的具体工作过程 2.2、P1 端口结构框图与工作原理2.3、P2 端口结构框图…

73 # 发布自己的 http-server 到 npm

1、添加 .npmignore 文件&#xff0c;忽略不需要的文件 public2、去官网https://www.npmjs.com/检查自己的包名是否被占用 3、切换到官方源&#xff0c;然后检查确认 nrm use npm nrm ls4、登录 npm 账号 npm login5、发布 npm publish6、查看发布情况&#xff0c;发布成功…

波奇学C++:stl的list模拟实现

list是双向带头链表。所以迭代器end()相当于哨兵卫的头。 list不支持和[]重载&#xff0c;原因在于list空间不是连续的&#xff0c;和[]的代价比较大。 访问第n个节点&#xff0c;只能用for循环&#xff0c;来实现 list<int> l; l.push_back(0); l.push_back(1); l.pu…

php检测数组是否存在某个键,和是否存在某个变量

一、array_key_exists() array_key_exists() 是一个 PHP 内置的函数&#xff0c;用于判断数组中是否存在指定的键。该函数接收两个参数&#xff0c;第一个是键名&#xff0c;第二个是数组。 $arr array(name > Jack, age > 20, country > China);if (array_key_exi…

Matlab图像处理-加法运算

加法运算 图像加法运算的一个应用是将一幅图像的内容叠加到另一幅图像上&#xff0c;生成叠加图像效果&#xff0c;或给图像中每个像素叠加常数改变图像的亮度。 在MATLAB图像处理工具箱中提供的函数imadd()可实现两幅图像的相加或者一幅图像和常量的相加。 程序代码 I1 i…

【每日一题】228. 汇总区间

【每日一题】228. 汇总区间 228. 汇总区间题目描述解题思路 228. 汇总区间 题目描述 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并…

k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC

文章目录 1、工作负载1.1、定义1.2、分类 2、Deployment2.1、定义2.2、Deployment创建2.3、Deployment 更新机制2.3.1、比例缩放&#xff08;Proportional Scaling&#xff09;2.3.2、HPA&#xff08;动态扩缩容&#xff09;2.3.2.1、需要先安装metrics-server2.3.2.2、配置hpa…

剪枝基础与实战(2): L1和L2正则化及BatchNormalization讲解

1. CIFAR10 数据集 CIFAR10 是深度学习入门最先接触到的数据集之一,主要用于图像分类任务中,该数据集总共有10个类别。 图片数量:6w 张图片宽高:32x32图片类别:10Trainset: 5w 张,5 个训练块Testset: 1w 张,1 个测试块Pytorch 集成了很多常见数据集的API, 可以通过py…

P1065 [NOIP2006 提高组] 作业调度方案

[NOIP2006 提高组] 作业调度方案 题目描述 我们现在要利用 m m m 台机器加工 n n n 个工件&#xff0c;每个工件都有 m m m 道工序&#xff0c;每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作&#xff0c;…

函数式编程-Stream流学习第一节

1 为什么学习 1.现在很多公司在编程中大量使用函数式编程-Stream流格式代码&#xff0c;所以为了能够看懂公司的代码 2.大量数据下处理集合效率高--因为有并行流 3.代码可读性高 4.消灭嵌套地狱 2 函数式编程思想 2.1 概念 面向对象编程是关注于用对象完成什么事情。而函数式…

联想小新Pro 16笔记本键盘失灵处理方法

问题描述&#xff1a; 联想小新Pro 16新笔记本开机准备激活&#xff0c;到连接网络的时候就开始触控板、键盘失灵&#xff0c;但是有意思的是键盘的背光灯是可以调节关闭的&#xff1b;外接鼠标是正常可以移动的&#xff0c;但是只要拔掉外接鼠标再插回去的时候就不能用了&…