邻接表建图方法及代码

原创 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;
 }


相关文章推荐

特殊“邻接表”建图方法

(此文借鉴 dollarzhaole 的 《邻接表建图方法及代码》 ) 说明:         建立无向图;         第一行输入n 表示边数; 输入示例:  5  3 4 6  3 7 8  ...

图邻接表有向表代码简洁实现

邻接表 有向表 1建一个表头数组[n]存放边表头 2 n个边表头数组存放每个边表信息 #in...

数据结构(C语言版)规范代码之图(邻接表的拓扑排序)

//图-邻接表-拓扑排序 #include #include #include using namespace std; #define INFINITY INT_MAX//最大值 #de...

图的邻接表表示代码C/C++

#include #include"iostream"#include"malloc.h"using namespace std;#define MaxVertexNum 50        //定义...

看数据结构写代码(36) 图的邻接表表示与实现

图的邻接表表示法,是为每一个顶点建立一个链表,链表里存放着相同弧尾的 弧的信息,这些链表顺序存放在数组中。下面是无向图g2的邻接表  邻接表 比 邻接矩阵 节省空间,同时 也带来一些操作上的 不便...

用图的邻接表法创建图的完整C代码实现

/* 无向图的邻接表法创建图的C代码实现 */ #include #include #include #define MaxSize 20 //图顶点的最大数量 typedef cha...

邻接表--创建图、删除图、深度优先搜索、广度优先搜索---代码

以下给出了以邻接表表示图时的:图建立、图删除、深度优先遍历、广度优先遍历的代码。 #include #include using namespace std; struct edge ...

邻接表存储图,DFS遍历图的java代码实现

import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visite...

数据结构(C语言版)规范代码之图(邻接矩阵与邻接表)

我只写了有相网和无向网的创建方法,以及与邻接表的转换方法,因为图的要简单一些,所以略去了,这个应付作业足够了~还希望大家多多指出不足 //图-邻接矩阵 #include #inc...

关于图的存储方法 (静态邻接表、前向星、边集数组)

一、邻接矩阵(不多说了)  G[u][v] 二、邻接表                   1、动态链表(指针)      一个数组表头(u)+ struct结点(v),相链,若有权值等信息再在结点里...
  • tclh123
  • tclh123
  • 2011年08月07日 17:34
  • 4859
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:邻接表建图方法及代码
举报原因:
原因补充:

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