zoukankan      html  css  js  c++  java
  • 从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;
    }
    
    
  • 相关阅读:
    NetCore使用Log4Net记录日志
    WCF数据协议中XmlArrayItem标签不起作用的问题
    WTM Blazor,Blazor开发利器
    WTM5.0发布,全面支持.net5
    log4netdemo
    mes 入库单号 锁表方案
    线程基础篇-线程同步
    线程基础篇-线程和进程
    EF基础篇-Code First
    EF基础篇-DB First
  • 原文地址:https://www.cnblogs.com/pprp/p/7787656.html
Copyright © 2011-2022 走看看