有若干个节点,有若干条边连接节点。(两个点之间不是必须相连)
比如:
在这里插入图片描述

有向图

可以理解为边上面有箭头的图,比如下面这张图:
在这里插入图片描述
在这张图中,点 111 可以通过这条有向边到达点 222,但是点 222 到达不了点 111
有向图的边是有单向性的。

无向图

只要连了边,边两端的点都可以互相到达。
在这里插入图片描述

这张图是无向图,里面任一点都可以互相到达。
这就是一张连通图。

连通图

一张无向图,如果任意一个点都可以到达图上的所有点,那么这张无向图就是连通图。
如图1

强连通图

一张有向图,如果任意两个点都可以互相到达,这就是一张强连通图。
在这里插入图片描述比如上面的这张图就是不联通的,不是强连通图。
如果再加上一条边:
在这里插入图片描述
现在这就是一张强连通图了。

带权图

可以理解为图中的边被加上了一个权值,经过这条边就要付出对应权值的代价。
比如:
在这里插入图片描述
在这张图中,点 111 走到点 444 的总权值是 3+5+2=103+5+2=103+5+2=10

图的存储

邻接矩阵

假设有一个 NNN 个点的图,我们可以开一个 N∗NN*NNN 的二维数组 aaaaija_{ij}aij 表示点 iii 到点 jjj 有没有边。
如果是带权图,也可以用 aija_{ij}aij 表示点 iii 到点 jjj 边的权值。

例题1

题目描述
给出一个无向图,顶点数为 nnn,边数为 mmmn≤1000,m≤10000n\le1000,m\le10000n1000,m10000
输入格式
第一行两个整数 n,mn,mn,m,接下来有 mmm 行,每行两个整数 u,vu,vu,v,表示点 uuu 到点 vvv 有一条边。
输出格式
由小到大依次输出每个点的邻接点,邻接点也按照由小到大的顺序输出。

首先 nnn 只有 100010001000,可以用邻接矩阵存图。
是无向图,所以 uuuvvvvvvuuu 都有一条边,所以要双向存。

#include<bits/stdc++.h>
#define psp putchar(' ')
#define endl putchar('\n')
using namespace std;
const int M=1e3+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x<10){putchar(x+'0');return;}print(x/10);putchar(x%10+'0');
}
int n,m;
int a[M][M];
signed main(){n=read(),m=read();for(int i=1;i<=m;i++){int u=read(),v=read();//双向存边a[u][v]=1;a[v][u]=1;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j])print(j),psp;//有边,输出。}endl;}
}
邻接表

假如一张图有 204820482048 个点,那么用邻接矩阵就要开 204822048^220482 的数组,那如果这张图只有 101010 条边,开这么大的空间就全浪费了。
这时候就要用到邻接表。
可以用动态数组来存点和边,减少空间的浪费。

vector<int>a[N];
例题2

题目描述
给出一个无向图,顶点数为 nnn,边数为 mmmn≤1000,m≤10000n\le1000,m\le10000n1000,m10000
输入格式
第一行两个整数 n,mn,mn,m,接下来有 mmm 行,每行两个整数 u,vu,vu,v,表示点 uuu 到点 vvv 有一条边。
输出格式
第i行输出第点 iii 的所有邻接点,邻接点按照度数由小到大输出,如果度数相等,则按照编号有小到大输出。

按照度数排序,用邻接表更方便。

#include<bits/stdc++.h>
#define endl putchar('\n')
using namespace std;
const int N=1e6+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x<10){putchar(x+'0');return;}print(x/10);putchar(x%10+'0');
}
int n,m;
vector<int>a[N];
int d[N];
bool cmp(int a,int b){//按照度数排序return d[a]<d[b]||(d[a]==d[b]&&a<b);
}
signed main(){n=read(),m=read();for(int i=1;i<=m;i++){int u=read(),v=read();//邻接表存图a[u].push_back(v);a[v].push_back(u);d[u]++,d[v]++;}for(int i=1;i<=n;i++){sort(a[i].begin(),a[i].end(),cmp);for(int j=0;j<a[i].size();j++)print(a[i][j]),psp;endl;}
}
例题3

题目描述
K(1≤K≤100)K(1\le K\le100)K(1K100) 只奶牛分散在 N(1≤N≤1000)N(1\le N\le1000)N(1N1000) 个牧场。现在她们要集中起来进餐。
牧场之间有 M(1≤M≤10000)M(1\le M\le10000)M(1M10000) 条有向路连接,而且不存在起点和终点相同的有向路。她们进餐的地点必须是所有奶牛都可到达的地方。
那么,有多少这样的牧场呢?
输入格式
第1行输入 K,N,MK,N,MK,N,M
接下来 KKK 行,每行一个整数表示一只奶牛所在的牧场编号。
接下来 MMM 行,每行两个整数,表示一条有向路的起点和终点。
输出格式
所有奶牛都可到达的牧场个数。

由于 NNN 最大只有 100010001000KKK 最大只有 100100100,所以可以考虑枚举每一头牛,然后记他们可以到达的点,最后的答案就有所有牛都能到达点的数量。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x<10){putchar(x+'0');return;}print(x/10);putchar(x%10+'0');
}
int n,m,k;
int cow[N];
vector<int>a[N];
int vis[N];
int dis[N];//dis[i]表示点i有几头牛可以到达
signed main(){k=read(),n=read(),m=read();for(int i=1;i<=k;i++)cow[i]=read();while(m--){int u=read(),v=read();a[u].push_back(v);}for(int i=1;i<=k;i++){queue<int>q;for(int j=1;j<=n;j++)vis[j]=0;vis[cow[i]]=1;q.push(cow[i]);while(!q.empty()){int x=q.front();q.pop();dis[x]++;//记录for(int p=0;p<a[x].size();p++){int y=a[x][p];if(vis[y])continue;vis[y]=1;q.push(y);}}}int ans=0;for(int i=1;i<=n;i++)ans+=(dis[i]==k);print(ans);
}
例题4

P3144 [USACO16OPEN] Closing the Farm S
依次遍历每个仓库关闭,检查是否能遍历到除关闭仓库外的所有仓库。

#include<bits/stdc++.h>
#define endl putchar('\n')
using namespace std;
const int N=1e6+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void putstr(string s){for(char v:s)putchar(v);
}
int n,m;
vector<int>a[N];
int cl[N];
int vis[N];
signed main(){n=read(),m=read();while(m--){int u=read(),v=read();a[u].push_back(v);a[v].push_back(u);}int st=1;for(int i=1;i<=n;i++){while(cl[st])st++;queue<int>q;q.push(st);for(int i=1;i<=n;i++)vis[i]=0;vis[st]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<a[x].size();i++){int y=a[x][i];if(vis[y])continue;if(cl[y])continue;vis[y]=1;q.push(y);}}bool flag=1;for(int i=1;i<=n;i++){if(cl[i])continue;if(!vis[i])flag=0;}cl[read()]=1;if(flag)putstr("YES");else putstr("NO");endl;}
}

最短路

一张带权图,一个点 xxx 到另一个点 yyy 所经过边的最小权值和称为点 xxx 到点 yyy 的最短路。

Dijkstra

一种高效的求最短路的算法,缺点是不能求带负权的最短路。
它的主要用途是求一个点到图中其他点的最短路。
具体过程
最开始,除了起点外所有点没有被标记过,起点是最开始被选中的点。
开始模拟:找到被选中的点连接的最小边权的且没有被标记过的点 yyy,记录最短路,然后点 yyy 被标记,并成为下一个被选中的点,直到所有点都被标记。

例题5

P4779 【模板】单源最短路径(标准版)
具体代码见单源最短路径

SPFA

讲解+例题见带负权的最短路问题


  1. 无向图 ↩︎

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

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

相关文章

电子设计大赛【C语言核心知识点】讲解

目录 前言 1. 基础语法 2. 流程控制 3. 函数 4. 数组与字符串 5. 指针&#xff08;核心重点&#xff09; 6. 内存管理 7. 结构体与联合体 8. 文件操作 9. 预处理器 10. 高级特性 内存布局图解 前言 在进行程序代码开发之前&#xff0c;需要掌握好C语言各个模块之间…

Numpy 库 矩阵数学运算,点积,文件读取和保存等

目录 1.数组&#xff08;矩阵&#xff09;的组合 2.数组&#xff08;矩阵&#xff09;的切割 3.数组的数学运算 4.数组的深拷贝和浅拷贝 5.随机模块 6.矩阵统计运算 7.矩阵的特有运算点积&#xff0c;求逆 8.文件读取和保存 1.数组&#xff08;矩阵&#xff09;的组合 水…

STL学习(?函数对象,谓词,内建函数对象)

目录 一、函数对象 1.函数对象的概念 2.函数对象的使用 &#xff08;1&#xff09;函数对象在使用的时候&#xff0c;可以像普通函数那样调用&#xff0c;可以有参数&#xff0c;也可以有返回值。 &#xff08;2&#xff09;函数对象超出普通函数的概念&#xff0c;函数对象…

【爬虫】05 - 爬虫攻防

爬虫05 - 爬虫攻防 文章目录爬虫05 - 爬虫攻防一&#xff1a;随机User-Agent爬虫1&#xff1a;fake-useragent2&#xff1a;高级反反爬策略3&#xff1a;生产环境建议二&#xff1a;代理IP爬虫1&#xff1a;获取代理IP2&#xff1a;高阶攻防3&#xff1a;企业级的代理实战三&am…

FPGA自学——存储器模型

FPGA自学——存储器模型 文章目录FPGA自学——存储器模型一、IP核二、ROM&#xff08;read only memory&#xff09;三、ROM的IP核调用四、RAM&#xff08;random access memory&#xff09;五、RAM的IP核调用总结1.不同波形的使用的存储器2.块与分布式的选择3.FPGA与模块的容量…

【C++】stack和queue拓展学习

目录 1.反向迭代器思路及实现 1.1. 源码及框架分析 1.2. 实现反向迭代器 2.stack和queue练习拓展-计算器实现 2.1. 后缀表达式概念 2.2. 后缀表达式运算规则 2.3. 中缀表达式转后缀表达式 2.3.1 转换思路 2.3.2 代码实现 2.4. 计算器实现 1.反向迭代器思路及实现 1.1…

Web3与区块链如何革新网络安全——走在前沿

随着互联网技术的飞速发展&#xff0c;网络安全问题日益成为全球关注的焦点。Web3和区块链技术作为新兴的技术力量&#xff0c;正在逐步改变网络安全的格局。本文将探讨Web3和区块链技术如何革新网络安全&#xff0c;走在技术前沿。 1. Web3技术概述 Web3&#xff0c;即第三代互…

网络初级安全第三次作业

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><style>* {margin:…

CSS中用display实现元素的显示/隐藏切换

** 通过display中的none和block ** 在前端开发中&#xff0c;display: none 和 display: block 是两种常用的 CSS 显示模式&#xff0c;核心区别在于&#xff1a;是否在页面中保留元素的占位空间 1. 核心区别属性display: nonedisplay: block占位空间元素完全从渲染树中移除&am…

因果图方法设计测试用例的价值与使用范围

一、因果图方法的核心原理 因果图方法通过分析软件规格说明中的输入条件&#xff08;因&#xff09;和输出结果&#xff08;果&#xff09;之间的逻辑关系&#xff0c;利用图形化方式将这些关系清晰展现。它使用特定的符号表示因果关系&#xff08;如恒等、非、或、与&#xff…

智慧农服数字化平台-数字科技赋能农业,开启智慧三农新篇章

智慧农服数字化平台数字科技赋能农业&#xff0c;开启智慧三农新篇章平台概览在乡村振兴和农业现代化的时代背景下&#xff0c;我们推出了创新的农业服务数字化平台——一个专为农业生产者打造的综合性SaaS服务平台。平台以"科技助农、数据兴农"为使命&#xff0c;通…

在线教育培训课程视频如何防下载、防盗录?

在数字化学习日益普及的今天&#xff0c;高质量的在线课程已成为教育机构、知识付费平台和讲师的核心竞争力。如何在不影响学员正常学习体验的前提下&#xff0c;有效防止课程视频被恶意盗取&#xff1f;今天介绍在线教育课程防下载、防盗录的10种视频加密方法&#xff0c;看看…

图像分析学习笔记(2):图像处理基础

图像分析学习笔记&#xff1a;图像处理基础图像增强方法图像复原方法图像分割方法形态学处理图像增强方法 目的&#xff1a;改善视觉效果&#xff0c;例如增强对比度定义&#xff1a;为了改善视觉效果、便于人或计算机对图像的分析理解&#xff0c;针对图像的特点或存在的问题…

生存分析机器学习问题

研究目标&#xff1a; 开发一个机器学习模型&#xff0c;用于个性化预测XXX的总体生存期。 模型输入&#xff1a;结合生存时间、治疗方案、人口统计学特征和实验室测试结果等多种特征。 模型输出&#xff1a;预测二元结果&#xff08;活着 vs. 死亡&#xff09;。 应用场景&…

【华为机试】547. 省份数量

文章目录547. 省份数量描述示例 1示例 2提示解题思路核心分析问题转化算法选择策略1. 深度优先搜索 (DFS)2. 广度优先搜索 (BFS)3. 并查集 (Union-Find)算法实现详解方法一&#xff1a;深度优先搜索 (DFS)方法二&#xff1a;广度优先搜索 (BFS)方法三&#xff1a;并查集 (Union…

09_Spring Boot 整合 Freemarker 模板引擎的坑

09_Spring Boot 整合 Freemarker 模板引擎的坑 1.背景&#xff1a; springboot 版本&#xff1a;3.0.2 2. 引入依赖 在 pom.xml 中添加&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

十七、【Linux系统yum仓库管理】替换阿里源、搭建本地yum源

替换阿里源、搭建本地yum源本章学习目标内容简介阿里外网源核心功能本地yum核心功能操作演示替换阿里外网源备份原有yum源清理冲突配置下载阿里源配置文件添加EPEL扩展源清理缓存重建索引验证源状态测试安装软件使用镜像搭建本地仓库准备ISO镜像创建挂载点目录挂载iso文件验证挂…

家庭网络怎么进行公网IP获取,及内网端口映射外网访问配置,附无公网IP提供互联网连接方案

在家庭网络中&#xff0c;我们常常需要通过公网IP来访问内网中的设备&#xff0c;比如家庭NAS、Web服务器或监控摄像头。要实现这个目标&#xff0c;首先要确保你的网络具有一个可用的公网IP&#xff0c;然后通过路由器配置端口映射&#xff08;Port Forwarding&#xff09;。如…

(LeetCode 面试经典 150 题 ) 128. 最长连续序列 (哈希表)

题目&#xff1a;128. 最长连续序列 思路&#xff1a;哈希表&#xff0c;时间复杂度0(n)。 用集合set来实现哈希表的功能&#xff0c;记录所有出现的元素。然后遍历元素&#xff0c;细节看注释。 C版本&#xff1a; class Solution { public:int longestConsecutive(vector&…

Altera Quartus:BAT批处理实现一键sof文件转换为jic文件

sof文件是Quartus编译默认生成的程序文件&#xff0c;用于通过JTAG口下载到FPGA内部RAM&#xff0c;断电程序会丢失&#xff0c;jic文件是用于固化到外部Flash中的程序文件&#xff0c;断电程序不会丢失。本文介绍如何通过批处理文件实现sof到jic的一键自动化转换。 Quartus工程…