从0开始 图论学习 链式前向星 最好的建图方法

链式前向星

writer:pprp

分析:比较难以理解,关键代码其实很短

如下:

结点声明:
int head[maxn];//表示以i为起点的第一条边的存储位置  
struct node  
{  
    int to;//第i条边的终点  
    int w;//第i条边的权值  
    int next;//与第i条边同起点的下一条边的存储位置  
};  
node e[maxn];  
建立语句:
for(int i = 0 ; i < ee; i++)
    {
        //i是第几条边
        cin >> x >> y >> z;
        e[i].to = y;
        e[i].w = z;
        //第i条边下一个指向起点x所指向的边
        e[i].next = head[x];
        //起点x指向第i条边
        head[x] = i;
    }
遍历语句:
 for(int i = 0 ; i < vv; i++)
        for(int k = head[i]; k != -1 ; k = e[k].next)
            cout << "op:" << k << " ed:" << e[k].to << " w:" << e[k].w << endl;
具体分析见图:

与前向星的区别:

前向星存在一个排序算法,而链式前向星算法在建立过程中没有用到排序,直接可以将某一个顶点的下一个边,下一个边存储起来,找完为止,分析如上图所示:
在建立的过程中,是正着来的,在遍历的过程中是倒过来的

参数解释:

head[i]: 保存的是以i为起点的所有边中编号最大的那个,而把这个当作顶点i的第一条起始边的位置

e[i].next: 表示与第i条边同起点的下一条边的存储位置

具体代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
struct node
{
    int to;
    int w;
    int next;
};
int head[maxn];
node e[maxn];

int main()
{
    int vv, ee;
    int x, y, z;
    cin >> vv >> ee;
    memset(head,-1,sizeof(head));
    for(int i = 0 ; i < ee; i++)
    {
        //i是第几条边
        cin >> x >> y >> z;
        e[i].to = y;
        e[i].w = z;
        //第i条边下一个指向起点x所指向的边
        e[i].next = head[x];
        //起点x指向第i条边
        head[x] = i;
    }
    for(int i = 0 ; i < vv; i++)
        cout << head[i] << ' ';
    cout << endl;
    for(int i = 0 ; i < ee; i++)
    {
        cout << i << ":" << e[i].to << " " << e[i].w << " " << e[i].next << endl;
    }
    for(int i = 0 ; i < vv; i++)
        for(int k = head[i]; k != -1 ; k = e[k].next)
            cout << "op:" << k << " ed:" << e[k].to << " w:" << e[k].w << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/pprp/p/7787656.html