图(一)

今天讲图最基本的东西---储存;

一、邻接矩阵:a[i,j]:=...(指从点i到点j的距离);存储方便,但损耗空间太多,若有10000个点就不行了。

二、邻接表:

这里需要使用指针:

这需要逆向保存,代码如下:

 1 type
 2    point=^node;
 3    node=record
 4                 u,v:longint; //u是和该点有边连接的点,v指这条边的权值。
 5                 next:point;
 6              end;
 7 var
 8    n,m,x,y,j:longint;  //n是点的数量,m是边的数量
 9    a:array[1..maxn]of point;
10    p:point;//如果要调用的话,需要加上head指针,否则直接用,就回不到最初的地址
11 begin
12     readln(n,m);
13     for  i:=1 to m do
14        begin
15            readln(x,y,j);
16            new(p); p^.u:=y; p^.v:=a[x]; a[x]:=p;
17            new(p); p^.u:=x; p^.v:=a[y]; a[y]:=p;
18        end;
19 end.
20 //这样建的邻接表就和上图一样,大家可以手动尝试一下。 

三、一个特殊且非常漂亮的结构,并查集:

并查集可以管理元素分组,①.查询元素a、b是否在同一组;②.合并元素a、b所在的组

并查集可用数来储存(不是二叉树),优化时,可以将根节点以下的点全部指向根结点,使高度从n变为2,复杂度大大大降低。

如果不清楚,可以先上网搜,再看下面的程序,手动画一下(画成树):

 1 var
 2   fa:array[1..maxn]of longint //记录点i的父亲,不是祖先
 3 {high:array[1..maxn]of longint  //树的高度}
 4 function find(k:longint):longint;  //查询元素k的祖先
 5 begin
 6   if fa[x]=x then exit(x)
 7   else fa[x]=find(fa[x]);  //非常重要,将所有的点全部指向根节点(祖先),降低复杂度
 8   exit(fa[x]);
 9 end;
10 procedure unite(x,y:longint);//合并元素x,y所在的集合
11 var
12   a,b:longint;
13 begin
14   a:=find(x);
15   b:=find(y);
16   if a<>b then fa[a]:=b;
17 {if high[a]<high[b] then fa[a]:=b
18   else begin fa[b]:=a;if high[a]=high[b] then inc(rank[a]); end; }
19 end;
20 //有{}的代码可要可不要,对做题影响不大
21    初始化时,fa[i]:=i;high[i]:=0; 

代码很短(去掉我加的注释),非常非常好用且漂亮的结构。

时间: 2024-08-30 09:32:24

图(一)的相关文章

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

时序图与状态图(Rose) - Windows XP经典软件系列

最近开始了自己高级数据结构之旅,在这次旅行中,我将持续把一些高级的数据结构从理论到编码都过一遍,同时通过博客形式分享出来,希望大家指出不足之处! 二叉排序树是一种动态排序的数据结构,支持插入.删除.查找等操作,且平均时间复杂度为O(log(N)),但是普通二叉排序树不能保证树退化为一颗分支的情况,此时最坏情况下的时间复杂度为O(N).此时,平衡二叉树的产生了.平衡二叉树是一种动态调整平衡的数据结构,但理想的平衡二叉树很难,于是人们使用AVL.红黑树.Treap.伸展树等来替代平衡二叉树,这些数据

类图(Rose) - Windows XP经典软件系列

最近开始了自己高级数据结构之旅,在这次旅行中,我将持续把一些高级的数据结构从理论到编码都过一遍,同时通过博客形式分享出来,希望大家指出不足之处! 二叉排序树是一种动态排序的数据结构,支持插入.删除.查找等操作,且平均时间复杂度为O(log(N)),但是普通二叉排序树不能保证树退化为一颗分支的情况,此时最坏情况下的时间复杂度为O(N).此时,平衡二叉树的产生了.平衡二叉树是一种动态调整平衡的数据结构,但理想的平衡二叉树很难,于是人们使用AVL.红黑树.Treap.伸展树等来替代平衡二叉树,这些数据

一张图掌握移动Web前端所有技术(大前端、工程化、预编译、自动化)

你要的移动web前端都在这里! 大前端方向:移动Web前端.Native客户端.Node.js. 大前端框架:React.Vue.js.Koa 跨终端技术:HTML 5.CSS 3.JavaScript 跨平台框架:React Native.Cordova 前端工程化:Grunt.Gulp.Webpack 前端预编译:Babel.Sass.Less 自动化测试:Jasmine.Mocha.Karma 一图在手,应有尽有! 更多信息参考:https://item.jd.com/12170351.h

Java企业微信开发_08_JSSDK多图上传

一.本节要点 1.1可信域名 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),可在企业微信的管理后台“我的应用”里设置应用可信域名.这个域名必须要通过ICP备案,不然jssdk会配置失败 1.2JS-SDK使用权限签名算法 1.2.1 签名生成规则如下: (1)参与签名的字段包括: noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) . (2)对所有待签名参数按照字段名的ASCII

以JPanel为基础实现一个图相框

代码: import java.awt.Graphics; import javax.swing.ImageIcon; import javax.swing.JPanel; public class Picture extends JPanel { private static final long serialVersionUID = -4437881316229152596L; private ImageIcon icon; public Picture(java.net.URL imgUR

jQuery----无缝轮播图

1.效果 2.html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" type="text/css" href="css/iconfont.css"> <link rel="stylesh

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

Android自己定义控件之轮播图控件

背景 近期要做一个轮播图的效果.网上看了几篇文章.基本上都能找到实现,效果还挺不错,可是在写的时候感觉每次都要单独去又一次在Activity里写一堆代码.于是自己封装了一下.这里仅仅是做了下封装成一个控件,不必每次反复写代码了. 效果图 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还须要在以下加一个指示器来标示滑动到了第几张轮播图.指示器我们能够用一个线性布局来依据要展示的轮播图设置显示的View,我们要做这种一个控件没