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;
    }
    
    
  • 相关阅读:
    设定cookie 获取cookie数据的转换
    cookie cookie的获取
    常见的请求方式 json字符串
    请求报文和响应报文
    http协议
    php分页查询 子查询
    MAC 地址为什么不需要全球唯一
    ceph分布式存储简介
    一文看懂为什么边缘计算是大势所趋
    真香!Windows 可直接运行 Linux 了
  • 原文地址:https://www.cnblogs.com/pprp/p/7787656.html
Copyright © 2011-2022 走看看