建模算法(五)——图与网络
(一)图与网络的基本概念
一、无向图
含有的元素为顶点,弧和权重,但是没有方向
二、有向图
含有的元素为顶点,弧和权重,弧具有方向。
三、有限图、无限图
顶点和边有限就是有限图,否则就是无限图。
四、简单图
既没有环,也没有两条边连接同一对顶点的图
五、完全图、二分图
每一对不同的顶点都有一条边相连的简单图称为完全图。
六、子图
就是被包含的图
七、顶点的度
就是顶点连接了几条边。
性质:1、全部顶点的度相加为偶数
2、 任意一个图的奇顶点的个数为偶数。
(二)图与网络的数据结构
一、邻接矩阵表示法
1、定义:
就是0-1矩阵,如果元素cij为“1”表示弧从第i个到第j个点,为“0”的话表示没有。如果是无向图则必定cij=cji。
2、一个demo:
3、缺点
浪费大量的空间
二、关联矩阵表示法
1、定义
在关联矩阵中,每行对应图的一个节点,每列对应图的一条弧。如果元素为“1”为一条弧的起点,元素为“-1”是一条弧的终点,元素为“0”与弧没有关联。
2、缺点:
浪费大量的弓箭
3、一个demo
三、弧表表示法
1、定义:
上面两种方法都是以点优先,这种方法以边优先,记录下来每个边的起点,终点和权重。
2、一个demo
四、邻接表表示法
1、定义
就是用一个单向链表存储所有的顶点,然后每个顶点又是一个单向链表的头指针, 引导着每个由它出发的弧。
2、一个demo
五、星形表示法
1、前向星形表示法
(1)定义:
定义2个数组,一个数组记录边信息的数组,跟换标表示法类似,然后还有一个数组记录每个出弧的起始地址编号
(2)demo
(3)性质
a、在point数组中,节点号比图的顶点多一个,一定要有point(1)=1,point(n)=m+1,
b、对于一个节点i,其对应的弧的信息数组的位置区间为
如果,则没有出弧。
(4)评价
能快速检索每个节点的所有出弧,但是没有办法快速检索每个节点的所有入弧。
2、后向星形表示法
(1)定义:
定义2个数组,一个数组记录边信息的数组,跟换标表示法类似,然后还有一个数组记录每个出弧的起始地址编号,但是是记录从终点到顶点。
(2)demo
3、双星型表示法
(1)加前向星形表示法的基础上,再加上一个正向弧对应的编号即可
(2)demo
(三)应用——最短路问题
一、从指定1点到其他所有点的最短路径(无向图)
1、算法
例子:
MATLAB编程求解
clc,clear;
a=zeros(6);
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25;
a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25;
a(5,6)=55;
a=a+a';
ll=find(a==0);
a(ll)=inf;
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;temp=1; %pb是用来标记是否走过(每次取最小路径所到达的地点),index1是指遍历地点的路径,index2是指到底地点前一个地点,然后从index1
%中找到它的最短路径。d是记录从1到每个地点的最短路径。
while sum(pb)<length(a)
tb=find(pb==0); %取出没走过的点
d(tb)=min(d(tb),d(temp)+a(temp,tb)); %用上一次的最小值,和前者与这次的步径相加相比较,得出当前的最短路径
tmpb=find(d(tb)==min(d(tb)));
temp=tb(tmpb(1)); %取出目前最短的路径,然后选定为下一个起点
pb(temp)=1;
index1=[index1,temp];
temp2=find(d(index1)==d(temp)-a(temp,index1)); %确定到目前点之前一点,确定的方法是用到此点的最短路径减去这次走的路径与之前的最短路径作比较。(按
%index1顺序),这样就可以得到上次来到此地的点。
index2(temp)=index1(temp2(1));
end
d,index1,index2
二、两个指定顶点之间的最短路径(有向图)
1、解法
约束条件的理解:i=1表示地点,当然不用回来了,出弧减入弧为1
i=n表示终点,当然不用出去了,出弧减入弧为-1
其他点有出有进,所以为0
2、demo
思路一:
以dp的思想来做,这样的话,通过递归来做就可以
思路二:
直接遍历,但是进行一个比较,明显不是最优解的省去
(四)树
一、基本概念
这里讲解的树为连通图的生成树。
二、应用——连线问题
解题思路:就是在连通赋权图上求解出最小生成树。
算法一:prim算法构造最小生成树
1、思想:
先定义一个顶点的集合,定义一个边的集合。然后构造一个最小生成树。然后选一点,从这点出发,一直寻找权重最小的边,加入到边的集合,直到涵盖了全部顶点为止。
2、demo
clc;clear;
a=zeros(7); a(1,2)=50;a(1,3)=60;
a(2,4)=65;a(2,5)=40;
a(3,4)=52;a(3,7)=45;
a(4,5)=50;a(4,6)=30;a(4,7)=42;
a(5,6)=70; a=a+a';
a(find(a==0))=inf;
result=[];p=1;tb=2:length(a);
while length(result)~=length(a)-1
temp=a(p,tb); %取出p向量里储存的顶点到其他未选中的点的边
temp=temp(:);
d=min(temp); %从中取出最小的,加入到result,将这个边的终点加入向量p
[jb,kb]=find(a(p,tb)==d);
j=p(jb(1));k=tb(kb(1));
result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
end result
算法二:Kruskal算法
1、思想
用index来存储各边端点的信息,当选中某一个边的时候,就将这边较的端点改为较小的端点,把后面的出现的也一并改掉,也就是所把这条边删掉。
2、demo
clc;clear; a(1,2)=50;a(1,3)=60;
a(2,4)=65;a(2,5)=40;
a(3,4)=52;a(3,7)=45;
a(4,5)=50;a(4,6)=30;a(4,7)=42;
a(5,6)=70; [i,j,b]=find(a);
data=[i';j';b']; %data存储每条边的端点和权值,index记录每条边的端点
index=data(1:2,:);
loop=max(size(a))-1;
result=[]; while length(result)<loop
temp=min(data(3,:));
flag=find(data(3,:)==temp);
flag=flag(1);
v1=data(1,flag);v2=data(2,flag); %每次找到之后,将数据存入data,而index就开始将线变成点,主要就是用来检验已经取过的树有没有已经走过这两点,
%从而避免圈的出现。
if index(1,flag)~=index(2,flag)
result=[result,data(:,flag)];
end
index(find(index==v2))=v1;
data(:,flag)=[];
index(:,flag)=[];
end result
(五)匹配问题
一、一些概念的理解= =
M其实就是边两端的点集
二、人员分配问题
1、提出
2、解决的算法
(1)匈牙利算法
(六)Euler图和Hamilton图
一、基本概念
1、Euler定义
Euler图就是能够不重复且走过每条边能够回到出发点的图。
2、定理:
3、Hamilton定义
Hamilton图就是能够不重复且走过每个顶点能够回到出发点的图。
二、Euler回路的Fleury算法
建模算法(五)——图与网络的更多相关文章
- [时序图笔记] 步步为营UML建模系列五、时序图(Squence diagram)【转】
概述 顺序图是一种详细表示对象之间以及对象与参与者实例之间交互的图,它由一组协作的对象(或参与者实例)以及它们之间可发送的消息组成,它强调消息之间的顺序. 顺序图是一种详细表示对象之间以及对象与系统外 ...
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- 20145212 实验五《Java网络编程》
20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...
- Java实验报告五:Java网络编程及安全
Java实验报告五:Java网络编程及安全 ...
- 20145210实验五《Java网络编程》
20145210实验五<Java网络编程> 实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码, ...
- Powerdesigner数据库建模--概念模型--ER图【转】
转自http://www.cnblogs.com/dekevin/archive/2012/07/18/2596745.html Powerdesigner数据库建模--概念模型--ER图 目标: ...
- Enterprise Architect UML 建模之活动图
EA(Enterprise Architect) UML 建模之活动图 一.活动图的概念作用 活动图本质上是一种流程图,它描述活动的序列,即系统从一个活动到另一个活动的控制流. 活动图的作用:描述 ...
- 20145237 实验五《Java网络编程》
20145237 实验五<Java网络编程> 一.实验内容 •1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: •2.利用加解密代码包,编译运行代码,一人加密,一人解密: •3 ...
- 20155229——实验五《 Java网络编程及安全》
20155229--实验五 Java网络编程及安全 实验内容 实验一: 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA ...
随机推荐
- [Winform]DataGridView列自适应宽度
引言 在做winform项目中,数据控件DataGridView的使用多多少少是会用到的,如果不设置它的属性,默认情况下是不会自适应宽度的,你想查看某项的数据,就不得不将标题栏拖来拖去,挺烦的. 方法 ...
- Linux shell的标准输入、输出和错误
编译文件时,若编译过程时间长,可以将 标准错误 重定向 输出到一个文件中 2 > 1.txt 也可以通过管道 重定向 到 标准输出 2 > &1 ...
- vssver2.scc 文件是干啥的?
idcdpi源文件下的tools下有一个文件 vssver2.scc vssver2.scc是什么文件 首先,先来个名词解释:Microsoft Visual Source Safe是美 ...
- dedecms删除没有文章的标签
要批量的删除织梦TAG标签,那我们就只能在数据库里做修改了. 登录数据库,在数据库里执行以下SQL语句: delete FROM dede_tagindex where typeid not in ( ...
- Fifth scrum meeting - 2015/10/30
概述 从昨天开始,我们的开发工作终于进入了正轨,由于之前没有mooc服务器API接口,一些工作无法进行. 因为我们团队开始开发较晚,因此我们将开发阶段的截至时间定为了下周五,测试阶段则压缩为下周周六和 ...
- 在生产环境使用Docker部署应用
导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...
- Bridge 使用
- tomcat安全配置(二)
1. JVM 1.1. 使用 Server JRE 替代JDK. 服务器上不要安装JDK,请使用 Server JRE. 服务器上根本不需要编译器,代码应该在Release服务器上完成编译打包工作. ...
- MySQL的分页
有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗?网上看到网上推荐了一些分页方法,但似乎不太可行,你能点评一下吗? 方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL ...
- Linux 怎么把自己写的脚本添加到服务里面,即可以使用service命令来调用
chmod 755 filename; mv filename /etc/init.d/; chkconfig --add filename #!/bin/bash #chkconfig: 345 8 ...