当前位置: 首页 > 编程日记 > 正文

链式前向星(模板)

一种非常厉害的存图的数据结构!

本质:模拟链表的操作,链式存储图。(2,3都可以模拟链表的操作,替代链表)

(1)二维数组存图:Map[x][y],一维代表出发点,二维代表它所连接的所有点。(不连接设为inf)

(2)链式前向星存图:head[x]相当于一维代表了出发点,之后T[i].next一条链相当于二维代表了所有(与它)连接的点。(不连接的到0就停止了)。

如head[x],T[head[x]].to,T[head[x]].w,T[head[x]].next,完美表示了一条边的两端点,权值,甚至下一条边存储位置序号。

所以说,二维数组存图很浪费空间(有的题目要求大也存不下),有的点之间没有连接就不用存(我们也不用),但二维数组把没链接的点之间也存下来了并且设为inf。

但链式前向星相当于链表,与某个点连接的所有点存下来形成一条链,有多少存多少,没有的就不存,节省了空间。(至于邻接链表就不说了,不直观操作不方便)

好,经过了链式前向星存图原理的诱导!明白了关键之处是:head[x]一维代表了出发点,之后一条链相当于二维代表了所有(与它)连接的点!

既然如此我们完全可以用vector代替链式前向星,因为vector更好理解看起来更直观!(本质:也相当于一条链,必须一个一个尾插入pushback,这就是链表啊!)

(3)vector链式顺序存图:vec[x][i],x即一维代表了出发点,[i]即二维代表了所有与x相连相关的点的信息依次链式顺序存放,成一条链。

注意:vector容器里面什么都可以塞,各种信息都存放的下,又相当于一个结构体。所以存图,对付空间问题,链式之类的最好用vector,一般都能解决。(虽然不一定比前向星快,但是操作方便,理解直观啊!)

更新实测:数据小量或一般的时候没什么,但大量或极端时,链式前向星比vector快!洛谷P4779,前向星比vector快了200ms左右!

一般情况下先vector好理解,一般够用了,不行了再换链式前向星!

前向星

 1 int head[maxn];//每个顶点(从i出发)的第一条边(相当于头指针,指向首元结点)
 2 struct px
 3 {
 4     int next;
 5     int to;
 6     int w;
 7 }T[maxm*3];//注意T存的是所有边数(边的连接信息,终点,权值,下条边都在这里),无向图是2倍
 8 
 9 
10 void Add(int x,int y,int z)//加边操作
11 {
12     T[++cnt].next=head[x];//相当于链表前插法,新结点指向了头指针指的结点
13     T[cnt].to=y;
14     T[cnt].w=z;
15     head[x]=cnt;//前插完成,头指针已经指向了新结点
16 }
17 
18 
19 for(int i=head[x];i;i=T[i].next)//遍历(与某个点x连接的所有边和点)
20 {
21     cout<<x<<' '<<T[i].to<<endl;//输出这条边的两个端点(x一直是一端,存的就是所有与它连接的点)
22     cout<<T[i].w<<endl;//输出这条边的权值
23     
24 }

vector改进

 1 struct px
 2 {
 3     //int next;
 4     int to;
 5     int w;
 6 }T;
 7 vector<px> vec[maxn];
 8 
 9 vec[x].push_back(T);//加边操作
10 
11 for(int i=0;i<vec[x].size();i++)//遍历(与某个点x连接的所有边和点)
12 {
13     int J=vec[x][i].to,W=vec[x][i].w;
14     cout<<x<<' '<<J<<endl;//输出这条边的两个端点(x一直是一端,存的就是所有与它连接的点)
15     cout<<W<<endl;//输出这条边的权值
16     
17 }

可以看到,用了vector存图无论是加边,遍历都方便直观了许多!

完。

转载于:https://www.cnblogs.com/redblackk/p/9722033.html

相关文章:

tar 打包问题

项目中使用到 tar 文件&#xff0c;同一个 tar 文件解压之后在压缩&#xff0c;在程序执行的时候不能使用了 原因是 tar 对文件名长度有限制&#xff0c;当文件名过程的时候&#xff0c;使用 --formatustar 进行压缩

QT webkit学习笔记(2)

五、QWebDataBase Class介绍 QWebDataBase提供了对基于JavaScript创建的HTML 5数据库。新一代的HTML 5标准也提供对基于javaScript SQL数据库访问的支持。QWebDataBase就是这些数据库的C接口。关于HTML 5的详情&#xff0c;可以参见HTML 5 Draft Standard. 六、QWebHistory Cla…

java 数组越界异常_数组越界异常 求解决!!!

源自&#xff1a;4-3 滚动状态判断与处理数组越界异常 求解决&#xff01;&#xff01;&#xff01;package com.example.imooc;import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.ne…

WPF外包公司—北京动点软件WPF最新的电子书整理打包下载

最近看到很多朋友寻找以前的WPF电子书&#xff0c;其实这些书在书店目前是很难买到了&#xff0c;不过还是很经典的&#xff0c;希望大家收藏~ WPF揭秘 http://download.csdn.net/detail/ping_vip/3935100 WPF经典教程 http://kiccp.sinaapp.com/store/info/83 WPF程序设计指南…

java后端判断用户是否关注公众号

/*** 判断用户是否关注了公众号* param openid* return*/ public static boolean judgeIsFollow(String openid){int subscribe 0; // String url "https://api.weixin.qq.com/cgi-bin/user/info?access_token"token"&openid"openid"&a…

QtCreator动态编译jsoncpp完美支持x86和arm平台

如果是做嵌入式开发。 在Qt下支持JSon最好的办法&#xff0c;可能不是采用qjson这个库。QJson这个库的实例只提供了x86环境下的编译方法。 Installing QJson-------------- QJson requires:- Qt 4.0 or greater- cmake 2.6 or greater For Unix/Linux/Mac: mkdir build cd b…

RADStudio连接MySQL_使用FireDac(Delphi)在Firebird中创建数据库

我最近从AnyDac改为FireDac(8.0.5.3365).我们正在运行Delphi 2006.当我使用此组件的AnyDac版本时,我可以通过执行以下操作来创建新数据库.设置我的连接fConnection.LoginPrompt : false;fConnection.ResourceOptions.SilentMode : true;fConnection.Params.Clear;fConnection.P…

valgrind 使用 kcachegrind 查看函数运行时间

安装 首先安装运行分析函数时间的工具 kcachegrind 下载安装包 http://kcachegrind.sourceforge.net/&#xff0c;下载最新的 tar.gz 文件 解压文件&#xff0c;进入解压之后的目录&#xff0c;从 README 中可以找到安装方式&#xff0c;这里记录一下 cmake . make -j8 sudo …

Red Hat Enteripse Linux5下配置yum源的方法

1。确保RHEL5中已经安装了yum。2。修改源配置文件 &#xff03;gedit /etc/yum.repos.d/CentOS-Base.repo在其中加入以下内容[base]nameCentOS-5-Base#mirrorlisthttp://mirrorlist.centos.org/?release$releasever5&arch$basearch&repoos#baseurlhttp://mirror.cento…

echarts如何修改散点大小

由于工作需要 懵懵懂懂接触到了echarts 很牛逼 遇到的问题是如何修改散点图中点点的大小&#xff0c;其他的图我没有涉及哦~ demo地址 http://www.echartsjs.com/examples/editor.html?cscatter-single-axis 找到左侧代码 1 symbolSize: function (dataItem) { 2 3 return da…

字节跳动java笔试题目_牛客网--字节跳动面试题--特征提取

牛客网--字节跳动面试题--特征提取博客说明文章所涉及的资料来自互联网整理和个人总结&#xff0c;意在于个人学习和经验汇总&#xff0c;如有什么地方侵权&#xff0c;请联系本人删除&#xff0c;谢谢&#xff01;来源链接&#xff1a;特征提取 来源&#xff1a;牛客网题目小明…

基于php下载文件的详解

基于php下载文件的详解 本篇文章是对php下载文件进行了详细的分析介绍&#xff0c;需要的朋友参考下php下载文件&#xff0c;比如txt文件。出现的效果就是&#xff0c;弹出浏览器自带的下载框&#xff0c;出现另存为操作。有时候会出现内存溢出和超时的现象。超时的话&#xff…

C#中DateTime.Now.Ticks的用法和说明

在C#中DateTime.Now.Ticks的常用于标示&#xff1a; 自 0001 年 1 月 1 日午夜 12:00:00以来&#xff0c;到当前时间为止&#xff1a;以0.1纳秒(1纳秒0.00000 0001秒)为单位的时间间隔数。用于非常精确的计算中使用。转载于:https://www.cnblogs.com/woaic/archive/2012/09/13/…

spring入门(二) 使用注解代替xml配置

1.导包(略) 2.applicationContext.xml如下: 1 <?xml version"1.0" encoding"UTF-8"?>2 <beans xmlns"http://www.springframework.org/schema/beans"3 xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"4 …

qt 找不到 -lpulse-mainloop-glib,找不到 -lpulse问题

问题&#xff1a;使用 QT 编写视频展现程序报错找不到运行时库文件 解决办法&#xff1a; 首先 sudo find / -name libpulse.so* 然后 sudo cp /usr/lib/x86_64-linux-gnu/libpulse.so.0 /usr/lib/libpulse.so 对于libpulse-mainloop-glib 首先find / -name libpulse-mainl…

INNO SETUP 获得命令行参数

INNO SETUP 获得命令行参数 原文 http://www.cnblogs.com/ahuo/archive/2009/07/30/1534998.html [Code]function GetMyParam(PName:String):String;var CmdLine :String; CmdLineLen :Integer; i :Integer;begin CmdLineLen:ParamCount(); fori:0to CmdLineLen dobeg…

java父子表_数据库二维表转父子关系,java,stream,list

需求描述&#xff1a;把数据库中的省市二维表&#xff0c;查询到内存中后&#xff0c;转换为父子层级关系。通过jdk8中的stream方式实现。数据关系&#xff1a;320004 福建省 320507 南平市430000 湖南省 430100 长沙市320000 江苏省 320583 昆山市…

java 概述

概述&#xff1a; 1.在java中&#xff0c;数据类型具有固定的大小&#xff0c;这消除了代码移植时令人头痛的主要问题。2.在网页中运行java程序成为applet3.public成为访问修饰符&#xff0c;它用于控制程序的其它部分对这段代码的访问级别。4.单引号的数据是char类型&#xff…

HOOK 技术

在介绍 截获系统消息钩子 之前&#xff0c;这几个函数是密切相关的&#xff1a; SetWindowsHookEx() 介绍&#xff1a; 功能&#xff1a;将应用程序定义的挂钩过程安装到挂钩链中。 函数原型&#xff1a;HHOOK SetWindowsHookEx( int idHook, // 钩子类型。…

QT 中使用 OpenCv 的 CascadeClassifier 报错

问题 在 QT 中调用 OpenCv 的 CascadeClassifier 进行人脸框检测的时候&#xff0c;在构造函数中进行检测器的初始化&#xff0c;随后调用相机读取图片的时候就会报错&#xff0c;报的错误是 Segment Fault &#xff08;段错误&#xff09; 解决 尝试使用 gdb&#xff0c;va…

java vuser脚本_loadrunner12中JavaVuser脚本的编写

1、环境准备&#xff1a;友情提示&#xff1a;用本地环境&#xff0c;不要用虚拟机LoadRunner11----->对应JDK1.6版本(32位)LoadRunner12----->对应JDK1.7版本(32位)(一)、JDK下载安装完成后&#xff0c;配置环境变量&#xff1a;1)、系统变量→新建 JAVA_HOME 变量 &…

IT阅读——关于“业务”

本文转自http://www.cnblogs.com/beijiguangyong/archive/2012/11/12/2767054.html 开发当中常常听说“业务”这个词&#xff0c;什么“业务为王”之类的词不绝于耳&#xff0c;那么什么是业务&#xff1f; 百度上的解释是&#xff1a;“‘业务’更白话一些来说&#xff0c;就是…

SSH无需密码密钥登录

2019独角兽企业重金招聘Python工程师标准>>> 无密码ssh登录的主要操作简单概述为&#xff0c;将本机中的ssh密钥对中的公钥如id_rsa.pub拷贝到目标机器的ssh验证文件authorized_keys中。 1、简洁操作步骤 摘录一 &#xff1a;使用ssh-copy-id 在192.168.42.142机器…

5-4 图片修补

import cv2 import numpy as np img cv2.imread(image0.jpg,1) for i in range(200,300): # 直接修改像素值 从200画到300这样一个位置上img[i,200] (255,255,255)#当前这样一根线占三个像素img[i,2001] (255,255,255)img[i,200-1] (255,255,255) for i in range(150,250):…

OpenCV 像素存储

像素存储 OpenCV 中图像矩阵的大小取决于所用的颜色模型&#xff0c;更准确的说是取决于图像所用到的通道数。 如果使用的是灰度图&#xff0c;矩阵大概如图所示&#xff1a; 如果使用的是多通道的图像&#xff0c;矩阵中的列会包含多个子列&#xff0c;子列的个数和通道数相…

java反射用在哪里_Java反射

昨天去参加比赛了&#xff0c;所以没有进行博客迁移。人生中的第一场健体比赛&#xff0c;虽然没得奖&#xff0c;但是收获和带来的思考颇丰。意外地进入了男子B组(174以上)的半决赛&#xff0c;然后在半决赛的时候还被裁判员点名出去单独比较&#xff0c;这个很让我惊喜。最后…

html中锚点的应用【本页面跳转】

设置锚点 <a name"top"></a> 同页跳转 <a href"#top">返回顶部</a> 不同页跳转 <a href"test.htm#top>跳转到test.htm页面顶部</a> 转载于:https://www.cnblogs.com/wangmars/p/3241855.html

SQL2005CLR函数扩展-正则表达式

用过Oracle的人都知道Oracle有四个正则表达函数REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和EGEXP_REPLACE&#xff0c;而SQLServer却无法完全实现上面的功能。以前我们知道用sp_OAxxx系列函数来调用js组建实现正则&#xff0c;现在我们可以通过CLR扩展来借助.Net实现。 ※ 代…

ROW_NUMBER() OVER函数的基本用法

简单的说row_number()从1开始&#xff0c;为每一条分组记录返回一个数字&#xff0c;这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序&#xff0c;再为降序以后的没条xlh记录返回一个序号。 2row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1…

OpenC 仿射变换

仿射变换&#xff08;Affine Transformation&#xff09;又称仿射映射&#xff0c;是指在几何中&#xff0c;一个向量空间进行一次线性变化并加上一个平移&#xff0c;变换位另一个的向量空间的过程。 一个任意的仿射变换都能够表示为乘以一个矩阵&#xff08;线性变换&#xf…