本文已参与「新人创作礼」活动,一起开启掘金创作之路。 链式前向星在效率上介于关系矩阵和邻接表,如果你觉得关系矩阵效率太低,又不想费事去造一个邻接表,那么你就可以选择链式前向星。
以起点 终点 权值的例子为例增加边
例:1 5 6
就是链接1和5权值为6。
下面我们以一组数据为例加边
5 7//点数为5,7条边
1 2 1
2 3 2
3 4 3
1 3 4
4 1 5
1 5 6
4 5 7
to[i]表示边i的终点
head[i]表示以i为起点的最后一条边,我们将head[]初始化为-1.
w[i]表示边i的权值
nex[i]表示与边i起点相同的上一条边
加边
cnt = 0;//边的编号
void add(int s, int e, int wt)
{
w[++cnt] = wt;
nex[cnt] = head[s];
to[cnt] = e;
head[s] = cnt;
}
进行边的遍历
for(int i = 1; i <= n; ++i)
{
for(int j = head[i]; j != -1; j = nex[j])
{
cout<<i<<" "<<to[j]<<" "<<w[j]<<endl;
}
}
储存例子的总代码
#include<bits/stdc++.h>
using namespace std;
int cnt = 0;
int w[100], nex[100], to[100], head[100];
void add(int s, int e, int wt)
{
w[++cnt] = wt;
nex[cnt] = head[s];
to[cnt] = e;
head[s] = cnt;
}
int main()
{
memset(head, -1, sizeof(head));
int n, m;
cin>>n>>m;
for(int i = 1;i <= m; ++i)
{
int s,e,wt;
cin>>s>>e>>wt;
add(s,e,wt);
}
for(int i = 1; i <= n; ++i)
{
cout<<i<<":\n"<<endl;
for(int j = head[i]; j != -1; j = nex[j])
{
cout<<i<<" "<<to[j]<<" "<<w[j]<<endl;
}
}
}