• 前向星


    前向星一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(如果是链式存储则不用排序),前向星就构造完了。

    1. 非链式

    首先通过建立数组存储边;

    然后对数组按起点从小到大排序;

    用len[i]来记录所有以i为起点的边在数组中的存储长度;

    用head[i]记录以i为边集在数组中的第一个存储位置;

    通过以上信息就可以存储图的所有信息;

    2. 链式(通过数组模拟链表)

    //结构体
    struct EDGE{
        int to,w,next;//v表示边的终点,w表示边的权值,next表示与这条边相同起点的下一条边
    }edge[200010];

    如何存储:

    //如果为无向图则添加两条边
    void
    addedge(int s,int t,int w){//s表示起点,t表示终点,w表示权值 edge[pos].to=t;//存这条边的终点,pos表示第几条边,起点没有特殊需求可以不存,因为后面head[]可以存储起点信息
       edge[pos].w=w;//存储边的权值 edge[pos].next
    =head[s];//存下以这条边同起点的另一条边,通过边连边达到链式的效果,如果是首条边则存-1,当遍历到-1是就表示把所有同起点的边遍历完了。 head[s]=pos++; //通过一直更新head[s]的值,使head[s]指向最后一条添加的以s为起点的边,遍历时就从最后添加的这条边往前面添加的遍历
    }

    遍历:

    非递归:

    for(int i = 1 ; i <= n ; i ++){
            for(int k = head[i] ; k != -1 ; k = Edges[k].next){
                cout << i << " " << Edges[k].to << " " << Edges[k].w << endl;
            }
        }

    递归:

    int flag[_Max];//下标表示对应的边,值为0表示未访问过,值为1表示访问过了
    void dfs(int s){
    if(head[s]==-1) return;
      for(int k=head[s];k!=-1;k = Edges[k].next){
    if(flag[k]==1) continue;
      cout << s << " " << edges[k].to << " " << Edges[k].w << endl;
    flag[k]=1;
    dfs(edges[k].to);
    }
    }

  • 相关阅读:
    HTML转码码表
    【转】javascript 小技巧 JavaScript[对象.属性]集锦
    枯燥的数据库插入修改,投机取巧的方法
    asp.net jquery ajax处理json数据
    .net生成zTree标准形式的json数据源
    SqlDateTime 溢出
    limit 与 offset
    祖国六十大寿阅兵
    Esri for Window Phone 7(一) 加载BingMap
    Create a Settings Page for Windows phone
  • 原文地址:https://www.cnblogs.com/zdl2234/p/10351139.html
Copyright © 2020-2023  润新知