图论的存储:简单来说就是对于比较抽象的点还有边怎么存到电脑上面来?怎么用数据结构存下来?
例如:对于n个点m 条边,每条边为(x,y,w),如下三种方式存储。
1.直接存储
#inlcude <bits/stdc++.h>
using namespace std;
struct Edge {
int u, v, w;
};
int n, m;
vector<Edge> e;
int main() {
cin >> n >> m;
e.resize(m + 1);
for (int i = 1; i <= m; i ++) cin >> e[i].u >> e[i].v >> e[i].w;
return 0;
}
2.邻接矩阵存储
#include <bits.stdc++.h>
using namespace std;
int n, m;
int e[1000][1000];
int main() {
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int u, v, w;
cin >> u >> v >> w;
e[u][v] = w;
//e[v][u] = w; 如果是无向图就加上
}
return 0;
}
3.邻接表存储
#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<pair<int,int>> e[100000]
int main() {
cin >> n >> m;
for(int i = 1; i <= m; i ++) {
int u, v, w;
cin >> u >> v >> w;
e[u].push_back({v,w});
//e[v].push_back({u,w}); 无向图加上
}
return 0;
}
4.链式前向星
#include <bits/stdc++.h>
using namespace std;
struct node {
int nxt, v, w;
} e[100000];
int head[100000];
int cnt = 0;
int n, m;
void add(int x, int y, int w) {
++ cnt;
e[cnt].v = y;
e[cnt].w = w;
e[cnt].nxt = head[x];
head[x] = cnt;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i ++) {
int x, y, w;
cin >> x >> y >> w;
}
}