[数据结构与算法-14]存图
存图

假设输入数据为\(u\),\(v\),\(w\),分别为开始点, 结束点,边权
邻接矩阵
用一个矩阵来保存两点之间的联系
\[\left(\begin{matrix}
0 & 1 & 1 & 0 & 1 \\
0 & 0 & 0 & 0 & 1 \\
0 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 1 \\
0 & 0 & 0 & 0 & 0 \\
\end{matrix}\right)
\]
| r -> c | 1 | 2 | 3 | 4 | 5 | 
|---|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 0 | 1 | 
| 2 | 0 | 0 | 0 | 0 | 1 | 
| 3 | 0 | 0 | 0 | 0 | 0 | 
| 4 | 0 | 0 | 1 | 0 | 1 | 
| 5 | 0 | 0 | 0 | 0 | 0 | 
cin >> u >> v >> w;
A[u][v] = w;
邻接表
用一个数组\(A[i]\)保存从\(i\)发出的所有边
构造边
struct edge{
    int to, w;
}
利用vector
#include <vector>
std::vector<edge> edges[MAX];
// 有向图
void add(int from, int to, int w){
    edges[from].push_back(edge({to, w}));
}
// 无向图
add(from, to, w);
add(to, from, w);
链式向前星
用数组模拟图
构造边
// next用来指向下一条边
struct edge{
    int to, w, next;
}
构造头
// head[i]保存从i发出的第一条边
int head[MAX];
构造数组存储所有的边
edge edges[MAX];
添加
// 用cnt保存当前边的条数
void add(from, to, w){
    edges[++cnt].w = w;
    edges[cnt].to = to;
    // 将下一条边指向当前的第一条边
    edges[cnt].next = head[from];
    // 更新第一条边为当前边
    head[from] = cnt;
}
遍历
for (int i = head[from];i;i = edges[i].next)
    printf("%d", edges[i].to);
| head | var | 
|---|---|
| 0 | 0 | 
| 1 | 1 | 
| 2 | 4 | 
| 3 | 0 | 
| 4 | 5 | 
| 5 | 0 | 
| edges | var | 
|---|---|
| 0 | 0 | 
| 1 | to=2,next=2 | 
| 2 | to=3,next=3 | 
| 3 | to=5,next=0 | 
| 4 | to=5,next=0 | 
| 5 | to=3,next=6 | 
| 6 | to=5,next=0 | 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号