邻接表

数据结构(C实现)------- 图的邻接表表示

拟墨画扇 提交于 2019-11-26 22:20:57
[本文是自己学习所做笔记,欢迎转载,但请注明出处: http://blog.csdn.net/jesson20121020 ]    图的邻接表表示法类似于树的孩子链表表示法,就是对图中的每个顶点vi,将所有邻接于vi的顶点链接成一个单链表,这个单链表就称为顶点vi的邻接表。在邻接表中有两种结点结构:头结点(vexdata,firstarc)、表结点(adjvex,nextarc)。    其中,表头结点由顶点域(vexdata)和指向第一条邻接边的指针域(firstarc)构成;表结点由邻接点域(adjvex)和指向下一条邻接边的指针域(nextarc)构成。    对于一个具有n个顶点、e条边的图G,若G是无向图,则它的邻接表需要n个表头节点组成的顺序表和2e个结点组成的n个链表;若G是有向图,则它的邻接表需要n个表头结点组成的顺序表和e个结点组成的n个链表。因此图的邻接表表示法的空间复杂度为S(n,e) = O(n+e)。若图中边的数目远远小于n^2,即图为稀疏图,则这时用邻接表表示要比用邻接矩阵表示节省空间。 算法实现:    图的邻接表存储结构描述如下: #define MAX_VERTEX_NUM 50 typedef enum { DG, UDG } GraphType; typedef char VertexType; //表节点 typedef struct

C--最短路 ----邻接表存储及SPFA算法

▼魔方 西西 提交于 2019-11-26 22:20:41
C--最短路 Time Limit: 7000MS Memory Limit: 65536KB Problem Description 给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。 Input 多组输入。 对于每组数据。 第一行输入n,m(1<= n && n<=5*10^5,1 <= m && m <= 2*10^6)。 接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。 最后输入s,e。 Output 对于每组数据输出一个整数代表答案。 Example Input 3 1 1 2 3 1 2 Example Output 3 思路: 由于节点的数据范围过大,因此无法利用二维数组存储路径,此时需要使用连接表存储路径。 SPFA算法: 1.可以解决有负权值的情况。 2.利用队列进行松弛操作。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <vector> #define inf 0x3f3f3f3f using namespace std; struct node { int id; int wi; } a,b;

图论------创建邻接表图,打印邻接表图,无权最短路径输出函数

╄→尐↘猪︶ㄣ 提交于 2019-11-26 22:19:31
// 图论算法 // #include "stdafx.h" #include <iostream> #include <queue> #include <stack> #include <vector> using namespace std; typedef struct vertex { int v; int Known; int Distance; int PreVertex; int Weight; vertex *next; }vertex; vertex *V[ 100 ]; //全局变量 /********************** 功能:创建无权邻接表 输入:顶点个数 输出:邻接表指针数组 **********************/ void createVertexNoWeight( int N) { vertex *q, *p; for ( int j = 0 ;j < N;j++) { int k; cin >> k; V[j] = new vertex; p = V[j]; V[j]->v = j; V[j]->Distance = 888888 ; V[j]->Known = 0 ; for ( int i = 0 ;i < k;i++) { int temp; cin >> temp; //第j个邻接表的顶点个数 q = new vertex;