邻接表建图方法及代码

原创 2012年05月09日 15:18:25
图论这块挺不好理解的,建图+最短路,代码不容易理解,尤其是建图过程。

以下是转的写的很好地一篇博文,图文并茂:


邻接表建图法1
极大的节省了空间和时间 是建图非常棒的一种方式
它利用数组模拟出边与边之间的关系  
图示解析(数据为代码中的测试数据):


#include<iostream>
  #define Maxn 200
  using namespace std;
  struct edge{int from,to,weight,next;}e[Maxn];//存储边信息的结构体 
 int first[Maxn];//起点为下标存储(e中边的位置) 
 int main()
 {
     int edges;//边数 
     memset(first,-1,sizeof(first));
     //因为刚开始first不指向任何一条边的下标,所以first都为-1 
     cin>>edges;//边数 
     for(int i=0;i<edges;i++)
     {
         cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重 
         e[i].next=first[e[i].from];first[e[i].from]=i;//不容易理解的地方
         /*
         利用first数组存储的是最新的(以数组下标为起点的)边的下标 
         并且该条边的next指向的是同样以数组下标为起点的下一条边的下标 
         直到下一条边的next=-1(即将所有以数组下标为起点的边都遍历了一遍) 
         */
     }
     for(int u=1;u<10;u++)//输出图 
     {
         cout<<"以"<<u<<"为起点的所有边的信息:"<<endl; 
         for(int v=first[u];v!=-1;v=e[v].next)//遍历以u为起点的所有边的信息 
             cout<<e[v].from<<" "<<e[v].to<<" "<<e[v].weight<<endl;
     }
     return 0;
 }
 /*
 5
 3 4 6
 3 7 8
 1 3 6
 2 4 7
 3 5 1
 */




邻接表建图法2
这种方式与上一种方式出自一个思想 
只不过是前者是利用数组模拟边之间的关系
而它是用指针来表示边之间的关系 

#include<iostream>
 #define Maxn 200
 using namespace std;
 struct edge
 {
     int from,to,weight;
     edge *next;
 }e[Maxn];//存储边 
 edge*first[Maxn];//所有以起点为下标的头指针
 int main()
 {
     int edges;//边数 
     for(int i=0;i<Maxn;i++)first[i]=NULL;
     //因为刚开始first不指向任何一条边,所以初始化first都为NULL 
     cin>>edges;//边数 
     for(int i=0;i<edges;i++)
     {
         cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重 
         e[i].next=first[e[i].from];first[e[i].from]=&e[i];//不容易理解的地方
         /*
         利用first数组存储的是最新的(以数组下标为起点的)边的地址 
         并且该条边的next指向的是同样以数组下标为起点的下一条边的地址 
         直到下一条边的next=NULL(即将所有以数组下标为起点的边都遍历了一遍) 
         */
     }
     for(int u=1;u<10;u++)//输出图 
     {
         cout<<"以"<<u<<"为起点的所有边的信息:"<<endl; 
         for(edge*v=first[u];v;v=v->next)//遍历所有以u为起点的边 
             cout<<v->from<<" "<<v->to<<" "<<v->weight<<endl;
     }
     return 0;
 }



邻接表建图3 
这种方式十分精巧,适合表明点之间的关联关系,并且可以统计出以某一点为起点的边的总数
但不能够存储权重,如果数据量比较大时,浪费的空间非常大

#include<iostream>
 #define Maxn 200
 using namespace std;
 int main()
 {
     int G[Maxn][Maxn],edges,from;
     for(int u=1;u<Maxn;u++)G[u][0]=0; //G[u][0]用于记录起点为u的边的总数 
     cin>>edges;//边数 
     while(edges--)
         cin>>from>>G[from][++G[from][0]];//起点 终点 
     for(int u=1;u<10;u++)//输出图 
     {
         cout<<"所有以"<<u<<"为起点的边共有"<<G[u][0]<<"条分别为: "<<endl; 
         for(int v=1;v<=G[u][0];v++)//输出所有以u为起点的边的信息 
         cout<<G[u][v]<<" ";
         cout<<"\n";
     }
     return 0;
 }


图的邻接表代码实现

图的邻接表代码实现(抄自mooc)/* 图的邻接表表示法 */ #define MaxVertexNum 100 /* 最大顶点数设为100 */ typedef int Vertex; ...
  • u010232308
  • u010232308
  • 2015年11月26日 09:49
  • 883

【数据结构】图的构建(邻接表法)

最近整理电脑,发现了以前写的数据结构的代码,由于时间久了,好多代码都找不到了,现在扒出来复习一下。 如果看不懂下面关于图的术语或者压根就不知道图。建议看一下严蔚敏版的《数据结构》中对图的介绍 ...
  • sundong_d
  • sundong_d
  • 2015年04月10日 19:12
  • 9555

数据结构:图的实现--邻接表

当图中的边数较少时,用邻接表来实现图结构,则会浪费很多内存空间。因此,考虑另一种实现图结构的方法:邻接表。在邻接表中主要有两种节点结构体:...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年08月01日 01:02
  • 5621

图的邻接表存储 c实现

用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化,指针指向null。然后边表...
  • linxinyuluo
  • linxinyuluo
  • 2011年10月07日 10:34
  • 51864

邻接表表示的图算法(示例代码)

  • 2009年07月25日 20:17
  • 3KB
  • 下载

邻接表创建图

邻接表:        当图中的边或弧数量远远小于图中的顶点数时,即为稀疏图时,邻接矩阵就成为稀疏矩阵,因此采用邻接表存储会避免造成空间浪费。        邻接表是图的链式存储,它克服了邻接矩阵...
  • zhaishaojiang
  • zhaishaojiang
  • 2014年11月30日 19:33
  • 1244

图的邻接表创建以及遍历

#define max_vertex_num 100 //该图可以为维护最大的结点个数。 typedef struct Arcnode { int adjvex;//该弧所指向的顶点的位置 ...
  • u011428875
  • u011428875
  • 2013年12月03日 15:39
  • 1382

数据结构:图的实现--邻接表

图的实现:邻接表 当图中的边数较少时,用邻接表来实现图结构,则会浪费很多内存空间。因此,考虑另一种实现图结构的方法:邻接表。在邻接表中主要有两种节点结构体: 顶点节点 边...
  • wsxsd94
  • wsxsd94
  • 2014年08月10日 12:56
  • 403

邻接表的实现(上)

以下这无向图实现: 这里注意的是在存储的过程中是先1后2在3,其排列是随机的。 代码如下: // c++_verts.cpp : 定义控制台应用程序的入口点。 // #include "std...
  • xiaozz_m608c
  • xiaozz_m608c
  • 2013年11月05日 19:17
  • 649

用vector实现邻接表的建图

一、vector 简介及基本操作: 1、vector是c++中stl库中封装好的容器,常用定义不定长数组来构建无向图或有向图. 2、基本操作: (1)头文件#include. (2)创建vector...
  • bokzmm
  • bokzmm
  • 2016年04月18日 19:42
  • 1968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:邻接表建图方法及代码
举报原因:
原因补充:

(最多只允许输入30个字)