静态邻接表

用于保存每个点出发的边。

(转)csdn     http://blog.csdn.net/yrhsilence/article/details/5978019
[cpp]
 view plaincopy

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. const long edge_maxn = 1005;  //边的最大上限
  5. const long point_maxn = 105;  //点的最大上限
  6. struct node
  7. {/*node存储边,一个edge代表一条边*/
  8. int v;  //终点位置
  9. int w;  //权值
  10. int next;  //同一起点的下一条边存储在edge数组中的位置(理解了这个静态邻接表就可以了)
  11. }edge[edge_maxn];
  12. int pre[point_maxn];  //以该点为起点的第一条边存储在edge数组中的位置
  13. int n; //点的数量
  14. int m; //边的数量
  15. void Init()
  16. {
  17. memset(pre,-1,sizeof(pre));
  18. int Index = 1;
  19. int i,x,y,w;
  20. for(i=0;i<m;i++)
  21. {
  22. scanf("%d%d%d",&x,&y,&w);
  23. edge[Index].v = y;
  24. edge[Index].w = w;
  25. edge[Index].next = pre[x];  //保存x起点的上一条边在edge数组中的位置
  26. pre[x] = Index++;  //位置更新
  27. }
  28. }
  29. void print()
  30. {
  31. for(int i=1;i<=n;i++)
  32. {
  33. printf("%d/n",i);
  34. for(int j=pre[i];j!=-1;j=edge[j].next)
  35. {
  36. printf(" -> %d value is %d/n",edge[j].v,edge[j].w);
  37. }
  38. //printf("/n");
  39. }
  40. }
  41. int main()
  42. {
  43. while(scanf("%d%d",&n,&m)!=EOF && (n!=0 || m!=0))
  44. {
  45. Init();
  46. print();
  47. }
  48. return 0;
  49. }

复制去Google翻译翻译结果

时间: 2024-08-09 14:14:47

静态邻接表的相关文章

poj1274_二分匹配_静态邻接表

贴一下板子... 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 8 #define MAX 202 9 bool flag, visit[MAX]; 10 int match[MAX]; 11 int cow, stall; 12 int h

图的存储结构:邻接矩阵(邻接表)&amp;链式前向星

[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组graph[ ][ ]来记录图中点a与点b之间是否连通,初始化为0(或者-1之类的看情况):如果图中有可忽略的重边(如 只需重边中的最小边或最大边),则保存需要的那条边的边权,但如果有无法忽略的重边,就一定不要用邻接矩阵. int graph[MAXN][MAXN]; void graphInit() { me

数据结构之图的邻接表

1.邻接表的简介: 图的邻接矩阵存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中.如词条概念图所示,表结点存放的是邻接顶点在数组中的索引.对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点.[1] 邻接

《数据结构》C++代码 邻接表与邻接矩阵

       上一篇"BFS与DFS"写完,突然意识到这个可能偏离了"数据结构"的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵.        存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表示i到j有没有单向边,邻接表则是对1~N中每个点都拉出一个链表来,链表E[i]中存的每个点j都表示i到j有一条单向边. 这两种方式各有利弊,在稀疏图中,邻接表更好,省时间而且省空间:在稠密图中,邻接矩阵更好,不浪费时间的同时省去了指针域的空间

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

邻接表

表示图的一种方法,用哈希链存储每一个顶点到其子节点的边信息.对于每一条边,我们存储两个顶点u,v及边的权值w. 拿图论基本图举例: 上图有11条边.我们从0开始为这些边标号: 先给出数组的存储方法(可能错误):用first[i]表示第编号为i的节点的第一个子节点的编号,这个子节点的选取是任意的.用next[i]表示编号为i的节点在这条哈希链中的下一个结点的编号. 对于节点3,一共有3个子节点:2,4,5,比如我们让first[3]=2.那么我们这么组织这条链: 用一个for遍历这条链:for(i

最短路径(四)—Bellman-Ford的队列优化(邻接表)

上一节我们写了Bellman-Ford算法解决负权边的问题: 邻接表存储图: n个顶点,m条边. 数组实现邻接表.对每一条边进行1-m编号.用u,v,w三个数组来记录每条边的信息,即u[i],v[i],w[i]表示第i条边是从第 u[i]号顶点到v[i]号顶点且权值为w[i]. first数组的1-n号单元格分别用来存储1-n号顶点的第一条边的编号,初始的时候因为没有边加入所有都是-1.即first[u[i]]保存顶点u[i]的第一条边的编号,next[i]存储"编号为i的边"的&qu

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另