• 图的储存方式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;
     } 


    邻接矩阵:

    矩阵算法 位运算时方便

    边集数组 前向星:

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

  • 相关阅读:
    NIO中几个非常重要的技术点
    NIO的epoll空轮询bug
    mysql支持跨表删除多条记录
    使用Fastjson生成Json字符串少字段属性(数据丢失)
    Linux系统下安装rz/sz命令及使用说明
    Slave_SQL_Running: No mysql同步故障
    二次幂权限设计
    spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)
    XStream别名;元素转属性;去除集合属性(剥皮);忽略不需要元素
    JDBC通用DAO
  • 原文地址:https://www.cnblogs.com/zzyh/p/6783272.html
Copyright © 2020-2023  润新知