zoukankan      html  css  js  c++  java
  • 如何构建邻接表【模板】【邻接表与邻接矩阵的选择】

    邻接表与邻接矩阵有相似的作用:用于储存一个图中所有的节点,但是邻接矩阵比较浪费内存,当数据较小时,邻接矩阵还可以计算

    但是一旦数据较大,用邻接矩阵往往就会超时或者超内存,这时就要使用邻接表来存图了;为方便理解邻接矩阵与邻接表的储存方式

    看下图:

        我们先规定一组数据

        1  10

        3   5

        8    9

       我们将所给的点标记为1(红色),其余为0

      (1)邻接矩阵(适合小数据点稠密型图)

    0 0 0 0 0 0 0 0 0 1
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 1 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 1 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0

    我们可以看到虽然只有三个点我们却不得不开一个10x10的二维数组来存放数据这极大的浪费了空间

    当遍历图时如果数据过大还可能会超时;那么邻接表呢?

    (2)邻接表:(适合大数据点稀疏型图)

    还是以上三个点

    V1————>V10

    V3————>V5

    V8————>V9

    只需要一个链即可完成 大大的节省了内存  详情如下图:

    下边附上构建邻接表的通用模板:

    /*
    *  构建邻接表模板 
    *
    */
    #include<stdio.h>
    #include<string.h>
    int head[100100];//表头,head[i]代表起点是i的边的编号 
    int cnt;//代表边的编号 
    struct s
    {
    	int u;//记录边的起点 
    	int v;//记录边的终点 
    	int w;//记录边的权值 
    	int next;//指向上一条边的编号 
    }edge[100010];
    void add(int u,int v,int w)//向所要连接的表中加入边 
    {
    	edge[cnt].u=u;
    	edge[cnt].v=v;
    	edge[cnt].w=w;
    	edge[cnt].next=head[u];
    	head[u]=cnt++;
    }
    int main()
    {
    	int n;
    	while(scanf("%d",&n)!=EOF)
    	{
    		int i;
    		cnt=0;
    		memset(head,-1,sizeof(head));//清空表头数组 
    		for(i=0;i<n;i++)
    		{
    			int u,v,w;
    			scanf("%d%d%d",&u,&v,&w);
    			add(u,v,w);
    		}
    		int u,v,w;
    		scanf("%d",&u);
    		for(i=head[u];i!=-1;i=edge[i].next)//输出所有与起点为u相连的边的终点和权值 
    		{
    			 v=edge[i].v;
    			 w=edge[i].w;
    			 printf("%d %d
    ",v,w);
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/tonghao/p/4708661.html
Copyright © 2011-2022 走看看