关于使用数组模拟邻接表表示图的一点看法
初学图论时对于用数组模拟邻接表的过程总是不太清楚,不知道点和边的对应关系时如何表示的,这里记录一下自己的学习过程,希望对大家有所帮助。
1. 连接结点并且赋予权重的模板(权重属性可以不唯一)
e[]存放新的结点, h[i] 存放的时结点i作为头节点的下一个结点的下标,ne[i]存放的是当前节点下一个节点的下标, w[i]存放的时当前结点i与下一个子结点之前的权重。
void add(a, b, c)
{
// e[]存放新的结点, h[i] 存放的时结点i作为头节点的下一个结点的下标
e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx++;
}
模拟过程
#include <iostream>
#include <cstring>
using namespace std;
const int N = 510;
int h[N], ne[N], e[N], w[N], idx;
int n,m;
void add(int a, int b, int c)
{
e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx++;
cout << "h[" << a << "] = " << h[a] << endl;
}
int main()
{
memset(h, -1,sizeof h);
cin >> n >> m;
while(m--)
{
int a,b,c;
cin >> a >> b >> c;
add(a,b,c);
}
// 下标
printf("下标 ");
for (int i = 0; i<=n; i++)
{
cout << i << " ";
}
puts("");
cout << " h:";
for (int i = 0; i<=n; i++)
{
cout << h[i] << " ";
}
puts("");
cout << " e:";
for (int i = 0; i<=n; i++)
{
cout << e[i] << " ";
}
puts("");
cout << "ne:";
for (int i = 0; i<=n; i++)
{
cout << ne[i] << " ";
}
puts("");
cout << " w:";
for (int i = 0; i<=n; i++)
{
cout << w[i] << " ";
}
puts("");
for (int j = 1; j<=n; j++)
{
for (int i = h[j]; i != -1; i = ne[i])
{
cout << "当前结点" << j << "的下一个结点是" << e[i] << "权重是" << w[i] << endl;
}
}
}
😵😵😵
求关注