图的储存+图的遍历

图的存储

邻接矩阵

cpp 复制代码
#include <iostream>

#include <cstring>

using namespace std;

const int N = 1010;

int n, m;

int edges[N][N];

int main()
{
 memset(edges, -1, sizeof edges);
 cin >> n >> m; // 读⼊结点个数以及边的个数 
 for(int i = 1; i <= m; i++)
 {
 int a, b, c; cin >> a >> b >> c; 
 // a - b 有⼀条边,权值为 c 
 edges[a][b] = c;
 // 如果是⽆向边,需要反过来再存⼀下 
 edges[b][a] = c;
 }
return 0;
}

邻接表

和树的存储⼀模⼀样,只不过如果存在边权的话,我们的vector数组⾥⾯放⼀个结构体或者是pair即 可。

cpp 复制代码
#include <iostream>

#include <vector>

using namespace std;

typedef pair<int, int> PII;//那个结点,权值

const int N = 1e5 + 10;

int n, m;
vector<PII> edges[N];

int main()
{
 cin >> n >> m; // 读⼊结点个数以及边的个数 
 for(int i = 1; i <= m; i++)
 {
 int a, b, c; cin >> a >> b >> c;
 // a 和 b 之间有⼀条边,权值为 c 
 edges[a].push_back({b, c});
 
 // 如果是⽆向边,需要反过来再存⼀下 
 edges[b].push_back({a, c});
 }
 return 0;
}

链式前向星

和树的存储⼀模⼀样,只不过如果存在边权的话,我们多创建⼀维数组,⽤来存储边的权值即可。

cpp 复制代码
#include <iostream>

using namespace std;

const int N = 1e5 + 10;

// 链式前向星 

int h[N], e[N * 2], ne[N * 2], w[N * 2], id;

int n, m;

// 其实就是把 b 头插到 a 所在的链表后⾯ 

void add(int a, int b, int c)
{
 id++;
 e[id] = b;
 w[id] = c; // 多存⼀个权值信息 
 ne[id] = h[a];
 h[a] = id;
}

int main()
{
 cin >> n >> m; // 读⼊结点个数以及边的个数 
 for(int i = 1; i <= m; i++)
 {
 int a, b, c; cin >> a >> b >> c;
 // a 和 b 之间有⼀条边,权值为 c 
 add(a, b, c); add(b, a, c);
 }
 return 0;
}

图的遍历

dfs

1.邻接矩阵

cpp 复制代码
#include <iostream>

#include <cstring>

#include <queue>

using namespace std;

const int N = 1010;

int n, m;

int edges[N][N];

bool st[N]; // 标记哪些点已经访问过 

void dfs(int u)
{
 cout << u << endl;
 st[u] = true;
 // 遍历所有孩⼦ 
 for(int v = 1; v <= n; v++)
 {
 // 如果存在 u->v 的边,并且没有遍历过 
 if(edges[u][v] != -1 && !st[v])
 {
 dfs(v);
 }
 }
}

int main()
{
 memset(edges, -1, sizeof edges);
 cin >> n >> m; // 读⼊结点个数以及边的个数 
 for(int i = 1; i <= m; i++)
 {
 int a, b, c; cin >> a >> b >> c; 
 // a - b 有⼀条边,权值为 c 
 edges[a][b] = c;
 // 如果是⽆向边,需要反过来再存⼀下 
 edges[b][a] = c;
 }
 return 0;
}

2.vector数组

cpp 复制代码
#include <iostream>

#include <vector>

#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 1e5 + 10;

int n, m;
vector<PII> edges[N];

bool st[N]; // 标记哪些点已经访问过 

void dfs(int u)
{
 cout << u << endl;
 st[u] = true;
 // 遍历所有孩⼦ 
 for(auto& t : edges[u])
 {
 // u->v 的⼀条边,权值为 w 
 int v = t.first, w = t.second;
 if(!st[v]) 
 {
 dfs(v);
 }
 }
}

int main()
{
 cin >> n >> m; // 读⼊结点个数以及边的个数 
 for(int i = 1; i <= m; i++)
 {
  int a, b, c; cin >> a >> b >> c;
 // a 和 b 之间有⼀条边,权值为 c 
 edges[a].push_back({b, c});
 
 // 如果是⽆向边,需要反过来再存⼀下 
 edges[b].push_back({a, c});
 }
 return 0;
}

bfs

邻接矩阵

cpp 复制代码
#include <iostream>

#include <cstring>

#include <queue>

using namespace std;

const int N = 1010;

int n, m;

int edges[N][N];

1
2
3
4
5
6
7
8
9
10
bool st[N]; // 标记哪些点已经访问过 

void bfs(int u)
{
 queue<int> q;
 q.push(u);
 st[u] = true;
 while(q.size())
 {
 auto a = q.front(); q.pop();
 cout << a << endl;
 for(int b = 1; b <= n; b++)
 {
 if(edges[a][b] != -1 && !st[b])
 {
 q.push(b);
 st[b] = true;
 }
 }
 }
}

int main()
{
 memset(edges, -1, sizeof edges);
 cin >> n >> m; // 读⼊结点个数以及边的个数 
 for(int i = 1; i <= m; i++)
 {
 int a, b, c; cin >> a >> b >> c; 
 // a - b 有⼀条边,权值为 c 
 edges[a][b] = c;
 // 如果是⽆向边,需要反过来再存⼀下 
 edges[b][a] = c;
 }
 return 0;
}

vector数组

cpp 复制代码
#include <iostream>

#include <vector>

#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 1e5 + 10;

int n, m;
vector<PII> edges[N];

bool st[N]; // 标记哪些点已经访问过 

void bfs(int u)
{
 queue<int> q;
 q.push(u);
 st[u] = true;
 while(q.size())
 {
 auto a = q.front(); q.pop();
 cout << a << endl;
 for(auto& t : edges[a])
 {
 int b = t.first, c = t.second;
 if(!st[b])
 {
 q.push(b);
 st[b] = true;
 }
 }
 }
}

int main()
{
 cin >> n >> m; // 读⼊结点个数以及边的个数 
 for(int i = 1; i <= m; i++)
 {
 int a, b, c; cin >> a >> b >> c;
 // a 和 b 之间有⼀条边,权值为 c 
 edges[a].push_back({b, c});
 
 // 如果是⽆向边,需要反过来再存⼀下 
 edges[b].push_back({a, c});
 }
 return 0;
}
相关推荐
搞笑症患者14 分钟前
压缩感知(Compressed Sensing, CS)
算法·最小二乘法·压缩感知·正交匹配追踪omp·迭代阈值it算法
im_AMBER18 分钟前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
予枫的编程笔记19 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
快手技术36 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱38 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
做科研的周师兄39 分钟前
【MATLAB 实战】栅格数据 K-Means 聚类(分块处理版)—— 解决大数据内存溢出、运行卡顿问题
人工智能·算法·机器学习·matlab·kmeans·聚类
X在敲AI代码40 分钟前
leetcodeD3
数据结构·算法
余瑜鱼鱼鱼1 小时前
Java数据结构:从入门到精通(十一)
数据结构
码农小韩1 小时前
基于Linux的C++学习——循环
linux·c语言·开发语言·c++·算法
CoderCodingNo1 小时前
【GESP】C++五级/四级练习(双指针/数学) luogu-P1147 连续自然数和
开发语言·c++·算法