链式前向星简单讲解

139 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 链式前向星在效率上介于关系矩阵和邻接表,如果你觉得关系矩阵效率太低,又不想费事去造一个邻接表,那么你就可以选择链式前向星。

以起点 终点 权值的例子为例增加边
例: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;
        }
    }
}