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

    参考链接:https://www.cnblogs.com/Kohinur/p/8947142.html

    链式前向星

    #include<iostream>
    #include<string.h>
    #include<queue>
    using namespace std;
    #define MAXN 100501
    struct NODE{
        int next;//与第i条边同起点的下一条边的位置
        int v;//第i条边的终点
        int w;//第i条边的边权
    }edge[MAXN];
    int cnt;//内存计数器
    int head[MAXN];
    bool visdfs[MAXN];
    bool visbfs[MAXN];
    void add(int u,int v,int w){
        edge[cnt].w=w;
        edge[cnt].v=v;    //edge[i]表示第i条边的终点
        edge[cnt].next=head[u]; //head[i]表示以i为起点的最后一条边的储存位置
        head[u]=cnt++;
    }
    void DFS(int x)
    {
        visdfs[x] = true;
        printf("%d
    ", x);
        for(int i = head[x]; i != 0; i = edge[i].next)
        {
            if(!visdfs[edge[i].v])
            {
                DFS(edge[i].v);
            }
        }
    }
    void BFS(int x)
    {
        queue<int> q;
        q.push(x);
        visbfs[x] = true;//标记
        while (!q.empty()) {
            int i=q.front();
            q.pop();
            cout<<i<<endl;
            for(int k = head[i]; k != 0; k = edge[k].next)
            {
                if(!visbfs[edge[k].v])
                {
                    visbfs[edge[k].v] = true; //标记
                    q.push(edge[k].v);
                }
            }
        }
    }
    void BFS1(int x)
    {
        int q[MAXN];//队列
        int jin = 0, chu = 0, st;
        q[jin++] = x;
        visbfs[x] = true;//标记
        while(chu < jin)
        {
            st = q[chu++];
            printf("%d
    ", st);
            for(int k = head[st]; k != 0; k = edge[k].next)
            {
                if(!visbfs[edge[k].v])
                {
                    visbfs[edge[k].v] = true; //标记
                    q[jin++] = edge[k].v;
                }
            }
        }
    }
    
    void Print()
    {
        int k, i;
        for(i = 1; i <= 5; i++)
        {
            if(head[i])//找边
            {
                for(k = head[i]; k != 0; k = edge[k].next)
                {
                    printf("%d->%d %d
    ", i, edge[k].v, edge[k].w);
                }
            }
        }
    }
    int main(){
        //init
        cnt=1;
        memset(head,0,sizeof(head));
        memset(visbfs, 0, sizeof(visbfs));
        memset(visdfs, 0, sizeof(visdfs));
        //一共有多少组数据
        int n;
        cin>>n;
        int a,b,c;
        while(n--){
            cin>>a>>b>>c;
            add(a,b,c);
        }
        //  Print();
        // DFS(1);
        BFS1(1);
        //访问某个点所有连接的点
        //    int start;
        //    cin>>start;
        //    for(int i=head[start];i!=0;i=edge[i].next)
        //        cout<<start<<"->"<<edge[i].v<<" "<<edge[i].w<<endl;
        return 0;
    }
    /*
    7
    1 2 1
    2 3 1
    3 4 1
    1 3 1
    4 1 1
    1 5 1
    4 5 1
    */
    

     vector存储

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #include<queue>
    #include<cstdlib>
    #define N 110
    #define INF 0x3f3f3f3f
    using namespace std;
    
    int n,m;
    bool visdfs[N];
    bool visbfs[N];
    
    struct node
    {
        int d,w;
    };//定义一个结构体来存储每个入度点以及对应边的权值
    //比如边u->d,权值为w,node结构体存储的就是d以及w。
    vector<node>v[N];
    
    void DFS(int x)
    {
        visdfs[x] = true;
        printf("%d
    ", x);
        vector<node> s=v[x];
        for(int i = 0; i <s.size(); i++)
        {
            if(!visdfs[s[i].d])
            {
                DFS(s[i].d);
            }
        }
    }
    void BFS(int x)
    {
        queue<int> q;
        q.push(x);
        visbfs[x] = true;//标记
        while (!q.empty()) {
            int i=q.front();
            q.pop();
            cout<<i<<endl;
            vector<node> s=v[i];
            for(int k = 0; k <s.size(); k++)
            {
                if(!visbfs[s[k].d])
                {
                    visbfs[s[k].d] = true; //标记
                    q.push(s[k].d);
                }
            }
        }
    }
    
    int main()
    {
        //对于N非常大但是M很小的这种稀疏图来说,用邻接矩阵N*N是存不下的。邻接矩阵是将所有的点都存储下来了,然而
        //对于稀疏图来说,有很多点是没有用到的,把这些点也存储下来的话就会很浪费空间。可以用邻接表来存储,这里借助vector来实现邻接表的操作。
        //用邻接表存储时候,只存储有用的点,对于没有用的点不存储,实现空间的优化。
        //n个点m条边
        memset(visdfs, 0, sizeof(visdfs));
        memset(visbfs,0,sizeof(visbfs));
        cin>>n>>m;
        int a,b,c;
        for(int i=0; i<=n; i++)
            v[i].clear();//将vecort数组清空
        for(int i=1; i<=m; i++) //用vector存储邻接表
        {
            node nd;
            scanf("%d%d%d",&a,&b,&c);
            nd.d=b,nd.w=c;//将入度的点和权值赋值给结构体
            v[a].push_back(nd);//将每一个从a出发能直接到达的点都压到下标为a的vector数组中,以后遍历从a能到达的点就可以直接遍历v[a]
            //        nd.d=a,nd.w=c;//无向图的双向存边
            //        v[b].push_back(nd);
        }
       // DFS(2);
        BFS(1);
        return 0;
    }
    

      

     

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    avalon background-image写法
    eslint 规则
    性能优化 && 用户体验
    gif
    react 生命周期
    git reset
    js 正则表达式
    大小写问题
    python中的负数取模问题(一个大坑)
    python中的__init_subclass__是什么?
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/10999988.html
Copyright © 2011-2022 走看看