• [笔记]: 前向星 标签: 数据结构存储 2017-05-25 09:13 35人阅读 评论(0) 收藏


    前向星与邻接表都存储图的方式
    前向星是一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序,如下面例程),前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。

    /*
    样例:
    6 8 
    1 2 1 
    1 3 1 
    1 6 1 
    2 4 1 
    3 4 1 
    3 5 1 
    4 6 1 
    5 6 1  
    */
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define M 1000
    #define N 1000
    using namespace std;
    int n,m;int num=0;//num是边的编号 
    int b[M],w[M],nt[M],p[N],flag[N];//N是最大顶点数,M是最大边数 
    /*
    b[i]=j表示编号为i的边 到达的点为j 
    w[i]=j表示编号为i的边 的权值为j 
    nt[i]=j表示编号为i的边 的前一个边为j
    p[i]=j 表示顶点p指向的边 的编号为j 
    */
    void insert(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            num++;
            b[num]=y;
            w[num]=z;
            nt[num]=p[x];
            p[x]=num;
            //无向图 右向图就没有下面这一半
            num++;
            b[num]=x;
            w[num]=z;
            nt[num]=p[y];
            p[y]=num;
        }
    }
    void dfs(int x){
        flag[x]=1;
        int e=p[x];//e是边的编号
        while(e>0){
            int k=b[e];
            if(!flag[k]){
                cout<<x<<"->"<<k<<"="<<w[e]<<endl;
                dfs(k);
            }
            e=nt[e];//前一条边 
        } 
    } 
    int main(){
        insert();
        dfs(1);
        return 0;
    } 

    同邻接表的广搜
    前向星的广搜遍历

    /*
    样例:
    6 8 
    1 2 1 
    1 3 1 
    1 6 1 
    2 4 1 
    3 4 1 
    3 5 1 
    4 6 1 
    5 6 1  
    */
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #define M 1000
    #define N 1000
    using namespace std;
    int n,m;int num=0;//num是边的编号 
    int b[M],w[M],nt[M],p[N],flag[N];
    queue<int>q;
    void insert(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            num++;
            b[num]=y;
            w[num]=z;
            nt[num]=p[x];
            p[x]=num;
            //无向图 右向图就没有下面这一半
            num++;
            b[num]=x;
            w[num]=z;
            nt[num]=p[y];
            p[y]=num;
        }
    }
    void bfs(int x){
        flag[x]=1;
        q.push(x);
        while(!q.empty()){
            int e=p[q.front()];
            int s=q.front();
            q.pop();
            while(e>0){
                int k=b[e];
                if(!flag[k])
                {
                    flag[k]=1;
                    cout<<s<<"->"<<k<<"="<<w[e]<<endl;
                    q.push(k);
                }
                e=nt[e];
            }
        } 
    } 
    int main(){
        insert();
        bfs(1);//开始的点为1 
        return 0;
    } 
  • 相关阅读:
    sqlserver中的锁与事务
    策略模式
    异步编程
    并行聚合操作
    EF中的自动追踪与代理
    C#6.0语法糖
    EF中使用SqlQuery进行参数化查询时抛出异常
    乐观并发
    为什么那么多公司不用 .NET
    sqlserver 更改跟踪相关知识
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183645.html
Copyright © 2020-2023  润新知