邻接矩阵

图的储存--邻接表

不想你离开。 提交于 2019-11-26 22:21:52
我学过的图的存储方式有两种,一种是用邻接矩阵存储,邻接矩阵的优点是可以快速判断两个顶点之间是否存在边,可以快速添加边或者删除边。但是他也有很明显的不足,那就是邻接矩阵的大小只能根据点来定义,若一个图的点较多但是边很少,如果用邻接矩阵来储存会浪费很大多的空间资源,这时我们的 邻接表登场了!!! 邻接表就是根据边来定义大小的。 介绍一下邻接表,邻接表可以用结构体 + 指针实现 也可以由结构体 + 数组实现 今天讲一下 结构体 + 数组 来实现邻接表 结构体模板 : #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXN 10000 struct { int value; //用来存边的权值 int to; //用来存边的末端 int next;// 用来储存下一条边的编号 }edges[MAXN]; int cnt = 0; //第一边的编号为零 int head[MAXN]; //储存以 i 为 始点的边的编号 void init(){ memset(head,-1,sizeof(head)); //初始化每个点均没在边中 } void add(int u,int v,int value){ edges[cnt].to = v; //编号为 cnt的边的末端 edges[cnt].value =

图论---邻接矩阵

巧了我就是萌 提交于 2019-11-26 22:20:06
一、图的定义 图是由顶点集合(Vertex)及顶点间的关系集合组成的一种数据结构:Graph=( V, E ) V = {x | x ∈某个数据对象 } 是顶点的有穷非空集合; E ={ (x, y) | x, y ∈V } 是顶点之间关系的有穷集合,也叫做边(Edge)集合。 注:∈为数学符号,表示属于的意思 。例:x∈y:表示x属于y的意思。 在图中的数据元素通常称为顶点 V 。 注意: 1、二叉树和线性表也符合图的特征。二叉树的所有结点相当于顶点的集合,结点间都存在一定的关系;线性表也是一样,也就是说二叉树和线性表是特殊的图。只不过图比线性表和树更加复杂罢了。 2、在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中的一个元素相关;而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。 二、基本术语 1、无向边 :若顶点 x 和 y 之间的边没有方向,则称该边为无向边(x, y),(x, y) 与 (y,x) 意义相同,表示 x 和 y 之间有连接。 2、无向图 :若图中任意两个顶点之间的边均是无向边,则称该图为无向图。 3、有向边 :若顶点 x 和 y 之间的边有方向,则称该边为有向边<x, y>,<x, y

数据结构与算法_韩顺平14十大算法

我怕爱的太早我们不能终老 提交于 2019-11-26 17:55:00
14.1 14.1 二分查找(非递归) package com.atguigu.binarysearchnorecursion; public class BinarySearchNoRecur { public static void main(String[] args) { //测试 int[] arr = {1,3, 8, 10, 11, 67, 100}; int index = binarySearch(arr, 100); System.out.println("index=" + index);// } //二分查找的非递归实现 * @param arr 待查找的数组, arr是升序排序 * @param target 需要查找的数 * @return 返回对应下标,-1表示没有找到 public static int binarySearch(int[] arr, int target) { int left = 0; int right = arr.length - 1; while(left <= right) { //说明继续查找 int mid = (left + right) / 2; if(arr[mid] == target) { return mid; } else if ( arr[mid] > target) { right = mid - 1

大话数据结构读书笔记系列(七)图

妖精的绣舞 提交于 2019-11-26 11:58:43
7.1 开场白 旅游几乎是每个年轻人的爱好,但没有钱或没时间也是困惑年轻人不能圆梦的直接原因。如果可以用最少的资金和最少的时间周游中国甚至是世界一定是非常棒的。假设你已经有了一笔不算很丰裕的闲钱,也有了约半年的时间。此时打算全国性的旅游,你将会如何安排这次行程呢? 我们假设旅游就是逐个省市进行,省市内的风景区不去细分,例如北京玩7天,天津玩3天,四川玩20天这样子。你现在需要做的就是制订一个规划方案,如何才能用最少的成本将图7-1-1中的所有省市都玩遍,这里所谓最少的成本是指交通成本与时间成本。 如果你不善于规划,很有可能就会出现如玩好新疆后到海南,然后再冲向黑龙江这样的荒唐决策。但是即使是紧挨着省市游完的方案也会存在很复杂的选择问题,比如游完湖北,周边有安徽,江西,湖南,重庆,陕西,河南等省市,你下一步怎么走最划算呢? 你一时解答不了这些问题是很正常的,计算的工作本来就非人脑应该是电脑去做的事情。我们今天要开始学习最有意思的一种数据结构--图。在图的应用中,就有相应的算法来解决这样的问题。学完这一章,即便不能马上获得最终答案,你也大概知道应该如何去做了。 7.2 图的定义 在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关

类似邻接矩阵的存放二分图方式

淺唱寂寞╮ 提交于 2019-11-25 23:44:51
例题:poj1274 这道题只给了10000kb的内存,按以前的vector存就炸了(然而我一开始不信邪,结果被疯狂罚时),所以联想了一下,发现二分图也是图,那可以使用拓展后的邻接矩阵来存。于是就搜了一下,还真有: #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<algorithm> #define M 507 #define inf 0x3f3f3f using namespace std; int cap[M][M],pre[M],c[M],flow[M][M]; int n,m; int EK(int s,int t){ memset(flow,0,sizeof(flow)); int sum=0; queue<int>q; while(1){ memset(c,0,sizeof(c)); c[s]=inf; q.push(s); while(!q.empty()){ int u=q.front(); q.pop(); for(int i=0;i<=t;i++) if(!c[i]&&cap[u][i]>flow[u][i]){ pre[i]=u; q.push(i); c[i]=min(c[u],cap[u][i]-flow[u][i]); } } if(!c[t]

20182311 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结

限于喜欢 提交于 2019-11-25 22:59:43
目录 教材学习内容总结 教材第十九章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 结对及互评 点评过的同学博客和代码 上周错题总结 学习进度条 参考链接 正文 20182311 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 教材第十九章 非线性结构——图 基本概念: 定义:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 邻接:若图中的两个顶点之间有边连接,那么他们是邻接的。 有向图(Directed graphs):图中任意两个顶点之间的边都是有向边。 无向图(Undirected graphs):图中任意两个顶点之间的边都没有方向。 入度(In-degree) : 表示有多少条边指向这个顶点 出度(Out-degre) : 表示有多少条边是以这个顶点为起点推向其他顶点 带权图:每条边对应一个权值,又称为网络。路径上的权轻易为路径中所含边上的权值之和。 最小生成树:所含边的权值之和小于等于图的任意其他生成树的边的权值之和的生成树。基于带权图实现最小生成树的算法思路如下: 将图各边按照权值进行排序 将图遍历一次,找出权值最小的边,加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。 递归重复步骤1,直到找出n