数据结构课程设计-最小生成树问题
最小生成树算法过程详解(信息系统项目管理师考试)

最小生成树算法过程详解针对最小生成树算法这一知识点,相当一部分课本和相关参考书对算法过程讲解并不是特别详尽。
本文主要针对信息系统项目管理师考试,对最小生成树算法过程进行逐步解析,以更加促进对知识点的理解和掌握。
1.概念在连通的带权图的所有生成树中,权值和最小的那棵生成树(包含图中所有顶点的树)称作最小生成树(权值:在数据结构领域,权值是树或者图中两个结点路径上的值,这个值表明一种代价,如从一个结点到达另外一个结点的路径的长度、所花费的时间、付出的费用等)。
2.带权连通无向图的最小生成树算法(1)普里姆(Prim)算法设已知G=(V,E)是一个带权连通无向图,U为构造生成树过程中已被考虑在生成树上的顶点的集合,顶点V={0,1,2,…,n-1},T是构造生成树过程中已被考虑在生成树上的边的集合。
Eij为顶点i、j之间的边,且i∈U,j∈V-U。
初始时,U只包含1个出发顶点i,T为空。
从出发顶点i开始查找,连接该顶点的所有边中,如果边Eij具有最小权值,那么最小生成树应包含Eij。
把j加到U中,把Eij加到T中,然后又从i、j开始,查找除去边Eij以外的连接i、j的最小代价边,依次重复上述过程,并使T不产生回路,直到U=V为止。
这时,T即为要求的最小代价生成树的边的集合。
普里姆算法的时间复杂度为O(n²),适合于稠密图(边数远远大于顶点数的图)。
(2)克鲁斯卡尔(Kruskal)算法设T(V,ψ)为初始状态只有n个顶点而无边的森林,顶点V={0,1,2,…,n-1},Eij为顶点i、j之间的边。
初始时,T只包含n个顶点。
按边代价递增的顺序,依次选择Eij并加入T,重复上述过程,并使T不产生回路,直到所有顶点均连接为止,此时T为最小生成树。
克鲁斯卡尔算法的时间复杂度为O(elog2e),较适合于稀疏图(边数远远小于顶点数的图)。
下面,分别运用两种算法对例题进行解析。
例:下图是某地区的通信线路图,假设其中标注的数字代表通信线路的长度(单位:千米),现在要求至少要架设多长的线路,才能保持6个城市的通信联通?普里姆算法:1.选择A为出发顶点,查找连接顶点A的顶点中权值最小的边。
数据结构普里姆算法

数据结构普里姆算法普里姆算法(Prim's algorithm)是一种贪心算法,用于在加权无向图中找到最小生成树。
该算法在每一步选择当前生成树到最远未连接点的最小边,直到所有的点都被连接起来。
以下是普里姆算法的基本步骤:1.随机选择图中的一点作为起始点,将其加入生成树集合中。
2.在所有连接已选择点和未选择点的边中,选择权重最小的边。
将这条边以及其对应的未选择点加入到生成树集合中。
3.重复步骤2,直到所有的点都被加入到生成树集合中。
下面是使用Python实现的普里姆算法示例:```pythonimport heapqdef prim(graph,start):mst={}#最小生成树的键值对,键为节点,值为该节点所在的最小权重边visited=set([start])#已访问的节点集合edges=[#用于存储最小权重边的优先队列,键为权重,值为边的信息(weight,start,to)for to,weight in graph[start].items()]heapq.heapify(edges)while edges:weight,frm,to=heapq.heappop(edges)if to not in visited:visited.add(to)mst[to]=(frm,weight)#将边加入最小生成树中for to_next,weight2in graph[to].items():if to_next not in visited:heapq.heappush(edges, (weight2,to,to_next))#将相邻未访问节点加入优先队列中return mst```其中,`graph`是一个字典,表示无向图的邻接表形式。
字典的键表示节点,值是另一个字典,表示与该节点相邻的节点及其对应的权重。
`start`是算法的起始点。
函数返回一个字典,表示最小生成树,其中键是节点,值是该节点所在的最小权重边。
信息学奥赛一本通 第4章 第6节 最小生成树(C++版) ppt课件

5
71
4
min[3]=w[2][3]=1; min[5]=w[2][5]=2;
第三次循环是找到min[3]最小的蓝点3。将3变为白点,接着枚举与3相连的所有 蓝点4、5,修改它们与白点相连的最小边权。
1
2 4
22 16
5
3
7
1
4
min[4]=w[3][4]=1; 由于min[5]=2 < w[3][5]=6;所 以不修改min[5]的值。
2
1
2
12
8
10
9
5
6
3
1个集合{ {1,2,3,4,5} } 生成树中有4条边{ <1,2> ,<4,5>,<3,5>,<2,5>}
3
74
ppt课件
16
Kruskal算法
算法结束,最小生成树权值为19。 通过上面的模拟能够看到,Kruskal算法每次都选择一条最小的,且能合并两 个不同集合的边,一张n个点的图总共选取n-1次边。因为每次我们选的都是最小的 边,所以最后的生成树一定是最小生成树。每次我们选的边都能够合并两个集合, 最后n个点一定会合并成一个集合。通过这样的贪心策略,Kruskal算法就能得到一 棵有n-1条边,连接着n个点的最小生成树。 Kruskal算法的时间复杂度为O(E*logE),E为边数。
第一行: 农场的个数,N(3<=N<=100)。
第二行..结 尾
后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论 上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们 限制在80个字符,因此,某些行会紧接着另一些行。当然,对角 线将会是0,因为不会有线路从第i个农场到它本身。
数据结构课程设计计划

信息工程学院14级计科、软件工程专业数据结构课程设计计划设计名称《数据结构》课程设计专业、班级计科1401-1403,软件1401-1402 课程性质必修设计周数1周课程学期学时数64学时学期学分4分指导教师签字系主任审核签字一.课程设计的目的通过课程设计的综合训练,旨在帮助学生进一步系统的掌握数据结构这门课的主要内容,并进一步培养学生分析问题和解决问题的能力,主要体现在能够让学生针对实际问题有效地组织数据,选择合适的数据结构,并进行正确和高效的算法设计,并用程序实现算法。
该课的课程设计是一个良好的程序设计技能训练的过程使学生能够:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工程专业学生所应具备的科学的工作方法和作风。
二.课程设计安排三.课程设计内容1.设计题目题目1:运动会分数统计【问题描述】参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)。
【基本要求】(1) 可以输入各个项目的前三名或前五名的成绩;(2) 能统计各学校总分;(3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;(4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校;(5) 学生自己根据系统功能要求自己设计存储结构,但是要求运动会的相关数据要存储在数据文件中并能随时查询;(6) 输入数据形式和范围:可以输入学校的名称,运动项目的名称;(7) 使用汉字显示。
Kruskal算法求最小生成树

荆楚理工学院课程设计成果学院:_______计算机工程学院__________ 班级: 14计算机科学与技术一班学生姓名: 陈志杰学号: 2014407020137设计地点(单位)_____B5101_________ ____________设计题目:克鲁斯卡尔算法求最小生成树__________________________________完成日期:2015年1月6日指导教师评语: ______________ ____________________________________________________________________________________________________________ ___________________________________________________________________________________________ ___________________________ __________ _成绩(五级记分制):_____ _ __________教师签名:__________ _______________注:介于A和C之间为B级,低于C为D级和E级。
按各项指标打分后,总分在90~100为优,80~89为良,70~79为中,60~69为及格,60分以下为不及格。
目录1 需求分析 (1)1.1系统目标 (1)1.2主体功能 (1)1.3开发环境 (1)2 概要设计 (1)2.1功能模块划分 (1)2.2 系统流程图 (2)3 详细设计 (3)3.1 数据结构 (3)3.2 模块设计 (3)4测试 (3)4.1 测试数据 (3)4.2测试分析 (4)5总结与体会 (6)5.1总结: (6)5.2体会: (6)参考文献 (7)附录全部代码 (8)1 需求分析1.1系统目标Kruskal算法是一种按照网中边的权值递增的顺序构造最小生成树的方法。
考研数据结构图的必背算法及知识点

考研数据结构图的必背算法及知识点Prepared on 22 November 20201.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。
这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。
即无向连通图的生成树不是唯一的。
连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。
图G5无向连通图的生成树为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1条边。
最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。
最小生成树的性质:假设N=(V,{E})是个连通网,U是顶点集合V的一个非空子集,若(u,v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。
解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。
他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。
时间复杂度O(N^2)假设G=(V,E)为连通图,其中V为网图中所有顶点的集合,E为网图中所有带权边的集合。
数据结构课程设计python
数据结构课程设计python一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常用数据结构如列表、元组、字典和集合的特点及应用场景。
2. 学习并掌握栈和队列的操作原理及其在Python中的实现方法。
3. 掌握树和图的基本概念,了解二叉树、遍历算法及图的表示方法。
技能目标:1. 能够运用Python语言实现基本数据结构,并对其进行增、删、改、查等操作。
2. 能够利用栈和队列解决实际问题,如递归、函数调用栈、任务调度等。
3. 能够运用树和图解决实际问题,如查找算法、路径规划等。
情感态度价值观目标:1. 培养学生严谨的逻辑思维,提高分析问题和解决问题的能力。
2. 激发学生对数据结构和算法的兴趣,培养良好的编程习惯。
3. 引导学生认识到数据结构在实际应用中的重要性,增强学习热情和责任感。
课程性质:本课程为高年级数据结构课程,旨在使学生掌握Python语言实现数据结构的方法,提高编程能力和解决问题的能力。
学生特点:学生具备一定的Python编程基础,具有较强的逻辑思维能力,对数据结构有一定的了解。
教学要求:结合实际案例,采用任务驱动法,引导学生通过实践掌握数据结构的基本原理和应用方法。
注重培养学生的动手能力和团队协作精神,提高学生的综合素质。
通过本课程的学习,使学生能够具备独立设计和实现小型项目的能力。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,结合Python语言特点,分析各类数据结构在实际应用中的优势。
- 列表、元组、字典和集合的原理与应用- 栈与队列的操作原理及实现2. 线性表:讲解线性表的概念,重点掌握顺序表和链表的操作方法。
- 顺序表和链表的实现及操作- 线性表的查找和排序算法3. 树与二叉树:介绍树的基本概念,重点讲解二叉树的结构及其遍历算法。
- 树的基本概念和表示方法- 二叉树的性质、存储结构、遍历方法4. 图:讲解图的基本概念,掌握图的存储结构及遍历方法。
- 图的基本概念和表示方法- 图的遍历算法(深度优先搜索、广度优先搜索)- 最短路径和最小生成树算法5. 算法分析与设计:结合实例,分析算法性能,掌握基本的算法设计方法。
《数据结构》课程设计
《数据结构》课程设计一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中基础的数据组织、管理和处理方法,培养其运用数据结构解决实际问题的能力。
课程目标如下:1. 知识目标:(1)理解基本数据结构的概念、原理和应用,如线性表、栈、队列、树、图等;(2)掌握常见算法的设计和分析方法,如排序、查找、递归、贪心、分治等;(3)了解数据结构在实际应用中的使用,如操作系统、数据库、编译器等。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,具备良好的编程实践能力;(2)掌握算法分析方法,能够评价算法优劣,进行算法优化;(3)能够运用数据结构进行问题建模,提高问题解决效率。
3. 情感态度价值观目标:(1)激发学生对计算机科学的兴趣,培养其探索精神和创新意识;(2)培养学生团队合作意识,学会与他人共同解决问题;(3)增强学生的责任感和使命感,使其认识到数据结构在信息技术发展中的重要性。
本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,为后续教学设计和评估提供依据。
课程注重理论与实践相结合,旨在提高学生的知识水平、技能素养和情感态度价值观。
二、教学内容《数据结构》教学内容依据课程目标进行选择和组织,确保科学性和系统性。
主要包括以下部分:1. 线性表:- 线性表的定义、特点和基本操作;- 顺序存储结构、链式存储结构及其应用;- 线性表的相关算法,如插入、删除、查找等。
2. 栈和队列:- 栈和队列的定义、特点及基本操作;- 栈和队列的存储结构及其应用;- 栈和队列相关算法,如进制转换、括号匹配等。
3. 树和二叉树:- 树的定义、基本术语和性质;- 二叉树的定义、性质、存储结构及遍历算法;- 线索二叉树、哈夫曼树及其应用。
4. 图:- 图的定义、基本术语和存储结构;- 图的遍历算法,如深度优先搜索、广度优先搜索;- 最短路径、最小生成树等算法。
5. 排序和查找:- 常见排序算法,如冒泡、选择、插入、快速等;- 常见查找算法,如顺序、二分、哈希等。
数据结构课程设计-学生-21个题目
选题一:迷宫与栈问题【问题描述】以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。
2)编写递归形式的算法,求得迷宫中所有可能的通路。
3)以方阵形式输出迷宫及其通路。
【测试数据】迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
出口出口选题二:算术表达式与二叉树【问题描述】一个表达式和一棵二叉树之间,存在着自然的对应关系。
写一个程序,实现基于二叉树表示的算术表达式的操作。
【任务要求】假设算术表达式Expression内可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,*,/,^(乘幂))。
实现以下操作:1)ReadExpre(E)—以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
2)WriteExpre(E)—用带括弧的中缀表达式输出表达式E。
3)Assign(V,c)—实现对变量V的赋值(V=c),变量的初值为0。
4)Value(E)—对算术表达式E求值。
5)CompoundExpr(P,E1,E2)--构造一个新的复合表达式(E1)P(E2)【测试数据】1)分别输入0;a;-91;+a*bc;+*5^x2*8x;+++*3^x3*2^x2x6并输出。
2)每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。
选题三:银行业务模拟与离散事件模拟【问题描述】假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。
最小生成树的优势和好处
最小生成树的优势和好处
最小生成树是一种用于解决连通图最短路问题的算法。
它可以帮助我们找到连接一个连通图中所有点的最小边权总和的子图。
最小生成树的优势和好处如下:
1. 算法简单易实现
最小生成树的算法思想简单明了,易于理解和实现。
基本上任何人都可以通过几行代码来实现它。
这样做使得最小生成树成为了一个非常实用的算法,它被广泛应用于实际生活中各种各样的问题中。
2. 计算效率高
最小生成树算法有很好的计算效率。
它可以处理大规模的数据集,而不会因为数据集过大而降低计算速度。
这使得我们可以在较短的时间内得到一个最小生成树,从而对一些实际问题提供有效的解决方案。
3. 可以帮助我们优化路线
使用最小生成树算法可以帮助我们优化路线。
对于一组给定的点,我们可以先用最小生成树算法找出它们之间最短的路径,然后再根据需要设定一些条件来进一步优化这条路径。
这样做可以大大提高我们在实际生活中旅游、交通等方面的效率。
4. 减少成本
最小生成树也可以用于减少成本。
它可以帮助我们找到一组连接点的最小边权总和,从而使我们在完成任务时尽可能的节省时间和成本。
例如,在通信网络的建设中,使用最小生成树算法可以有效地降低网络建设的成本。
5. 能帮助我们更好地理解图论
最小生成树算法是图论中的重要算法。
通过学习最小生成树算法,我们能够更好地理解图论的基础知识和主流算法。
这将有助于我们更深入地学习并掌握相关的技术和数据结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
安徽省巢湖学院计算机与信息工程学院
课程设计报告 课程名称 《数据结构》 课题名称 最小生成树问题 专 业 计算机科学与技术 班 级 10计本2班 学 号 ******** 姓 名 张娟 联系方式 150****6692 指导教师 江家宝 20 11 年 12 月 30 日 “最小生成树问题”课程设计 题目: 编制一个求出N个顶点图的最小生成树程序
一 需求分析:
(1)在n个城市间建设通信网络,只需要架设n-1条线路即可。以最低的代价建设这个通信网,即求图的最小生成树。 (2)利用克鲁斯卡尔算法求网的最小生成树。 (3)利用自定义的队列结构存放连通分量。 (4)以文本形式输出最小生成树中的各条边及它们的权值。输出格式为(int a,int b,int n),其中a,b为顶点序号,n为ab边的权; (5)程序运行流程: 1)提示输入顶点数目; 2)接受输入,按照项目要求产生边权值的随机矩阵;然后求解最小生成树; 3)输出最小生成树并且退出; (6)测试数据:9
二 概要设计: 1.表示边的类定义和接口: class MyArc { public: int m_beginVex; int m_endVex; int m_weight; MyArc(int beginVex,int endVex,int weight); MyArc(){} //重载运算符 inline bool operator < (const MyArc& arc){ return m_weightinline bool operator == (const MyArc& arc){ return m_weight==arc.m_weight;} inline bool operator > (const MyArc& arc){ return m_weight>arc.m_weight; } }; 2. 用邻接矩阵表示的图类的定义和接口: class Graph { private: int m_vexnum; int m_arcnum; int *m_pmatrix; public: ~Graph(); Graph(int vexnum); Graph(int vexnum,int *pmatrix); void insert(MyArc arc);//连通arc 边 bool bound(int x); //判断顶点x是否已与其它顶点连通 }; 3. 自定义队列,用于存放连通图,或按权排列后的边: class MyQueues { public: list m_list; MyQueues(){} void insert(const MyArc& arc); //按权值大小排序插入 void InsertGraph(const Graph &graph); //将图的连通分量插入队列 MyArc pop();//出队列 };
4.本程序的结构 1)主程序模块: void main() { 申明边权值矩阵数组并用随机函数初始化; 创建图; 调用克鲁斯卡尔算法函数; 输出边的权值矩阵,最小生成树中的各条边及它们的权值 退出; } 2)带权的边类模块---实现带权边的存储和运算。 邻接矩阵类模块---实现图的状态记录和相关操作。 自定义队列类模块---实现边的按权存贮和相关操作。 3)核心kruskal算法模块---用克鲁斯卡尔算法求出最小生成树 各模块调用关系:
三 详细设计 #include #include//产生随机数组用 #include //同上 //#include "basic.h" //所用到的自定义数据结构定义和实现文件 using namespace std; #include /*MyStack 堆栈类的结构 [ 0 1 ... curlen ... size] [栈底(bottom) ... prt ... ]*/ #define BASESIZE 64 //默认堆栈数组空间大小(8*8),可以自扩充 template class MyStack { private: Type *bottom; // 元素存放的动态数组 int size,ptr; // 堆栈大小和当前栈顶元素索引 public: //构造函数 MyStack() { bottom=new Type[BASESIZE];ptr=-1;size=BASESIZE; }; //析构函数 ~MyStack(){delete []bottom;}; //清栈还原 inline void clear() { if(bottom!=NULL) delete []bottom; bottom=new Type[size]; ptr=-1; }; //判栈空 inline bool IsEmpty() { if(ptr==-1) return true; else return false; } //入栈 int push(Type e); //出栈 int pop(Type &e); //获得栈顶元素 int top(Type &e); int settop(Type e); // 用callback函数对栈从低向上遍历 void traverse(void callback(Type *),Type *); private: inline int extent() { int s=size; Type *temp=new Type[size]; for(int i=0;itemp[i]=bottom[i]; size*=2; clear(); ptr=s+1; for(int i=0;ibottom[i]=temp[i]; delete [] temp; return size; }
}; /*MyStack的实现 */ /*压栈*/ template int MyStack::push(Type e) // { if(++ptr==size) extent(); bottom[ptr]=e; return ptr; } /*出栈*/ template int MyStack::pop(Type &e) // { if(ptr==-1) return -2;//栈空,返回 -2 ! else e=bottom[ptr--]; return ptr; } /*获取栈顶元素*/ template int MyStack::top(Type &e) // { if(ptr==-1) return -1;//栈空,返回 -1 ! else e=bottom[ptr]; return ptr; } /*设置栈定元素*/ template int MyStack::settop(Type e) // { if(ptr==-1) return -1;//栈空,返回 -1 ! else bottom[ptr]=e; return ptr; } /*用callback函数对栈从低向上遍历*/ template void MyStack::traverse(void callback(Type *),Type *e) { if(callback!=NULL) { for(int i=0;i<=ptr;i++) { e=&bottom[i]; callback(e); } } }; // /*MyPoint 坐标结构 */ typedef struct MyPoint { int x, y; } *pMyPoint; // /*表示边的类*/ class MyArc { public: int m_beginVex; int m_endVex; int m_weight; MyArc(int beginVex,int endVex,int weight); MyArc(){} bool operator < (const MyArc& arc) { return m_weight} bool operator == (const MyArc& arc) { return m_weight==arc.m_weight; } bool operator > (const MyArc& arc) { return m_weight>arc.m_weight; } }; MyArc::MyArc(int beginVex,int endVex,int weight):m_beginVex(beginVex),m_endVex(endVex),m_weight(weight)