当前位置: 首页 > news >正文

C++算法题—图的邻接矩阵输入形式(I\O)

平时刷题发现图论相关的题遇到的比较少,但考场上一旦遇到如果连如何输入、如何存图都不回,那岂不是连骗分的机会的没了,所以写一篇博客记录一下,图的存储方式很多种,这里只针对最常用最简单的邻接矩阵,只有邻接表、链式前向星等各有缺点,且不易理解,大家可以去找别的文章观看

一、邻接矩阵的核心概念

邻接矩阵是用二维数组存储图的结构:

  • 对于有 n 个顶点的图,邻接矩阵是 n×n 的数组 g
  • 无权图:g[u][v] = 1 表示 u 和 v 之间有边,0 表示无边。
  • 带权图:g[u][v] 存储 u 到 v 的边权(不可达用 INF 表示,如 0x3f3f3f3f)。
  • 无向图:邻接矩阵对称g[u][v] = g[v][u]);有向图:邻接矩阵非对称

二、常见输入形式分类

至于如何接收输入根据下面的分类参考我的上一篇I\O大全:输入输出大全

1. 无权无向图(边列表 → 邻接矩阵)

输入:顶点数 n,边数 m,随后 m 行边 (u, v)(顶点编号通常从 1 开始)。
示例输入

5 6
1 2
1 3
2 3
2 4
3 5
4 5

(5 个顶点,6 条无向边)

2. 无权有向图(边列表 → 邻接矩阵)

输入:顶点数 n,边数 m,随后 m 行有向边 (u, v)
示例输入

4 5
1 2
1 3
2 4
3 2
4 1
3. 带权无向图(边列表 + 权值 → 邻接矩阵)

输入:顶点数 n,边数 m,随后 m 行边 (u, v, w)w 为边权)。
示例输入

3 3
1 2 5
2 3 8
1 3 10
4. 带权有向图(边列表 + 权值 → 邻接矩阵)

输入:顶点数 n,边数 m,随后 m 行有向边 (u, v, w)
示例输入

3 4
1 2 3
2 3 5
1 3 1
3 2 2
5. 直接输入邻接矩阵

输入:顶点数 n,随后 n 行,每行 n 个整数(直接给出 g[u][v] 的值)。
示例输入

3
0 1 2
1 0 3
2 3 0

三、模板题:邻接矩阵存储 + 深度优先搜索(DFS)遍历

题目:给定无向无权图的邻接矩阵,从顶点 1 出发进行 DFS 遍历,输出遍历顺序。

输入
第一行是顶点数 n,接下来 n 行,每行 n 个整数(1 表示有边,0 表示无边)。

示例输入

5
0 1 1 0 0
1 0 1 1 0
1 1 0 0 1
0 1 0 0 1
0 0 1 1 0

输出:DFS 遍历的顶点顺序(如 1 2 3 5 4)。

代码实现

#include <iostream>
#include <vector>
using namespace std;const int MAXN = 1005;
int n;              // 顶点数
int g[MAXN][MAXN];  // 邻接矩阵
bool visited[MAXN]; // 标记顶点是否访问过// 从顶点u出发的DFS
void dfs(int u) {visited[u] = true;cout << u << " "; // 输出当前顶点for (int v = 1; v <= n; ++v) {// 若v未访问且u与v有边if (!visited[v] && g[u][v] == 1) {dfs(v);}}
}int main() {cin >> n;// 读取邻接矩阵for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {cin >> g[i][j];}}// 初始化访问标记fill(visited, visited + MAXN, false);// 从顶点1开始DFSdfs(1);return 0;
}

四、进阶模板题:邻接矩阵 + Floyd 求全源最短路径

题目:给定带权有向图的邻接矩阵(不可达用 INF 表示),求所有顶点对的最短路径长度。

输入
第一行是顶点数 n,接下来 n 行,每行 n 个整数(g[i][j] 为边权,INF 表示不可达,顶点自身权为 0)。

示例输入

4
0 2 5 0x3f3f3f3f
0x3f3f3f3f 0 2 4
0x3f3f3f3f 0x3f3f3f3f 0 1
1 0x3f3f3f3f 0x3f3f3f3f 0

输出:所有顶点对的最短路径矩阵(不可达输出 INF)。

#include <iostream>
#include <algorithm>
using namespace std;const int MAXN = 1005;
const int INF = 0x3f3f3f3f; // 表示“无穷大”(不可达)
int n;
int g[MAXN][MAXN];   // 原始邻接矩阵
int dist[MAXN][MAXN];// 存储最短路径int main() {cin >> n;// 读取邻接矩阵并初始化distfor (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {cin >> g[i][j];dist[i][j] = g[i][j];}}// Floyd算法:枚举中间点k,更新所有i→j的最短路径for (int k = 1; k <= n; ++k) {for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (dist[i][k] != INF && dist[k][j] != INF) {dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);}}}}// 输出结果for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (dist[i][j] == INF) {cout << "INF ";} else {cout << dist[i][j] << " ";}}cout << endl;}return 0;
}

总结

邻接矩阵的输入需根据 “图的类型(有向 / 无向、带权 / 无权)” 选择不同的读取方式:

  • 边列表形式:需先读顶点数、边数,再逐条边填充邻接矩阵。
  • 直接矩阵形式:直接读取 n×n 的数组。
    结合 DFS、Floyd 等算法,可完成图的遍历、最短路径等基础任务。

文章转载自:

http://4t2d6mVx.dfztx.cn
http://xHZuU1V7.dfztx.cn
http://X0X1a6mm.dfztx.cn
http://tFVpT1oD.dfztx.cn
http://tFNV5zn0.dfztx.cn
http://bZMBJL9g.dfztx.cn
http://rYmJKNz4.dfztx.cn
http://M2eBNoAh.dfztx.cn
http://kbQ3Yj5O.dfztx.cn
http://iHSFNKOC.dfztx.cn
http://mX6hb18m.dfztx.cn
http://JnDNzwka.dfztx.cn
http://sPBnfADq.dfztx.cn
http://gZTaKVez.dfztx.cn
http://GGMzU4IJ.dfztx.cn
http://RexGJsLX.dfztx.cn
http://jo0mHHpm.dfztx.cn
http://yc611AUX.dfztx.cn
http://Ckk8wFvJ.dfztx.cn
http://BqKN3dnj.dfztx.cn
http://qGuquMWt.dfztx.cn
http://snHX8Qzi.dfztx.cn
http://mrTvnaqy.dfztx.cn
http://7KjaaKJZ.dfztx.cn
http://quDcBt2S.dfztx.cn
http://mpVN3p1c.dfztx.cn
http://FRbr368N.dfztx.cn
http://EtG3rIVA.dfztx.cn
http://DwcdRaHq.dfztx.cn
http://P5X71Wj7.dfztx.cn
http://www.dtcms.com/a/382954.html

相关文章:

  • 主动性算法-如何让机器拥有嗅觉?
  • Knockout.js Google Closure Compiler 工具模块详解
  • 从关键词匹配到语义理解:6大Embedding技术如何重塑企业搜索
  • 【面试实录01】
  • Docker 容器化部署核心实战——镜像仓库管理与容器多参数运行详解
  • Jenkins的安装与简单使用
  • Step-by-Step:用C语言构建一个带精准错误提示的括号匹配器
  • 【LeetCode - 每日1题】元音拼写检查器
  • KingbaseES读写分离集群架构解析
  • 教育领域大模型生成题目安全研究报告
  • .Net程序员就业现状以及学习路线图(七)
  • uniapp如何使用本身的字体图标
  • Uniapp崩溃监控体系构建:内存泄漏三维定位法(堆栈/资源/线程)
  • window显示驱动开发—显示适配器的子设备
  • 单变量单步时序预测 | TCN-BiGRU时间卷积神经网络结合双向门控循环单元
  • 项目实战——“微商城”前后台【005】之前台项目首页编写
  • 如何利用redis使用一个滑动窗口限流
  • Go与Python/PHP的比较
  • JVM 运行时数据区详解:程序计数器、虚拟机栈、堆内存、方法区与直接内存
  • MongoDB $type 操作符
  • 【靶场练习】--DVWA第一关Brute Force(暴力破解)全难度分析
  • ConcatenationShortcut
  • 设计模式(C++)详解—原型模式(3)
  • 设计模式(C++)详解—原型模式(2)
  • 使用 kubeasz的ezdown部署单节点集群(aio),作为k8s集群的测试环境教程
  • pytest -- 中文文档
  • 数据库造神计划第八天---增删改查(CRUD)(4)
  • Spark专题-第一部分:Spark 核心概述(2)-Spark 应用核心组件剖析
  • LLM大模型-大模型微调(常见微调方法、LoRA原理与实战、LLaMA-Factory工具部署与训练、模型量化QLoRA)
  • 使用Docker轻松部署Neo4j图数据库