图的储存+图的遍历

图的存储

邻接矩阵

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;
}
相关推荐
ValhallaCoder2 分钟前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮5 分钟前
AI 视觉连载1:像素
算法
智驱力人工智能36 分钟前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥1 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风1 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風2 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT062 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠2 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
想进个大厂2 小时前
代码随想录day37动态规划part05
算法
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章22-Harris角点
图像处理·人工智能·opencv·算法·计算机视觉