zoukankan      html  css  js  c++  java
  • 图的储存方式4.28

    // 邻接矩阵遍历
    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define N 10010 
    int x,y,z,n,m,a[N][N],vis[N];
    void dfs(int x)
    {
        vis[x]=1;
        for(int i=1;i<=n;i++)
        if(a[x][i]&&!vis[i])//相连的 但是没有遍历过的 
        dfs(i);
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        scanf("%d%d%d",&x,&y,&z);
        a[x][y]=z;
        dfs(1);
        return 0;
    }
    //邻接表 
    #include<iostream>
    #include<cstdio> 
    using namespace std;
    #define N 10010 
    int x,y,z,n,cnt,v[N],next[N],head[N],len[N];
    void add_edge(int x,int y,int z)//head为表头 
    {
        v[++cnt]=y;
        next[cnt]=head[x];
        head[x]=cnt;
        len[cnt]=z;
    }
    void dfs(int x){
         vis[x]=1;
        for(int i=head[x];i;i=next[i]){
            if(!vis[v[i]]){
                dfs(v[i]);
            }
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y,&z);
            add_edge(x,y,z);
        }
        return 0;
    }
    //vector 储存图 
    #include<iostream>
    #include<cstdio>
    #include<vector>
    using namespace std;
    #define N 10010
    int vis[N],x,y,z;
    vector<pair<int,int> >vec[N];//> >中间要有空格 
    void dfs(int x){
        vis[x]=1;
        for(int i=0;i<vec[x].size();i++){
            if(!vis[vec[x][i].first])dfs(vec[x][i].first);
        }
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);
            vec[x].push_back(make_pair(y,z));
        }
        return 0;
    }
    //前向星
    #include<iostream>
    #include<cstdio>
    #include<algorithm> 
    using namespace std;
    #define N 10010
    struct st{int x,y,z;}a[N];
    int vis[N],cnt,L[N],R[N];
    bool cmp(st a,st b){return a.x<b.x;}
    void dfs(int x){
        vis[x]=1;
        for(int i=L[x];i<R[x];i++){//遍历以x为起点的边 
            if(!vis[a[i].y])dfs(a[i].y);
        }
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);//输入点数和边数 
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);//起点 终点 权值 
            a[++cnt].x=x;a[cnt].y=y;a[cnt].z=z;//只记录边的信息 
        }
        sort(a+1,a+cnt,cmp);//根据出点大小排序,这样同一个点所连出的边都是连续的 
        for(int i=1;i<=m;i++){
            if(a[i].x!=a[i-1].x){ //出现新的结点时,新结点的边的终点的区间左端点为i,上个结点边终点区间的右端点为i 
                L[a[i].x]=R[a[i-1].x]=i;
            }
        }
        dfs(1);
        return 0;
     } 


    邻接矩阵:

    矩阵算法 位运算时方便

    边集数组 前向星:

    没有将边挂在点上 而是储存每条边的信息 一般不需要遍历整张图  常用于并查集 方便排序

  • 相关阅读:
    Java的代码风格
    哪些你容易忽略的C语言基础知识
    Java基础学习笔记第二章
    Java代码性能优化总结
    Java并发编程(2):线程中断(含代码)
    C语言代码训练(一)
    数控G代码编程详解大全
    PLC编程算法
    博客转移到新地址
    一些吐槽
  • 原文地址:https://www.cnblogs.com/zzyh/p/6783272.html
Copyright © 2011-2022 走看看