2024年10月克鲁斯卡尔算法求最短路径(kruskal算法是什么)

 更新时间:2024-10-12

  ⑴克鲁斯卡尔算法求最短路径(kruskal算法是什么

  ⑵kruskal算法是什么

  ⑶kruskal算法是:克鲁斯卡尔算法。是求连通网的最小生成树的另一种方法。与普里姆算法不同,它的时间复杂度为O(eloge、(e为网中的边数,所以,适合于求边稀疏的网的最小生成树。

  ⑷克鲁斯卡尔(Kruskal算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E,令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{},概述图中每个顶点自成一个连通分量。

  ⑸在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止。

  ⑹克鲁斯卡尔算法的时间复杂度主要由排序方法决定,而克鲁斯卡尔算法的排序方法只与网中边的条数有关,而与网中顶点的个数无关,当使用时间复杂度为O(eloge的排序方法时,克鲁斯卡尔算法的时间复杂度即为O(loge,因此当网的顶点个数较多、而边的条数较少时,使用克鲁斯卡尔算法构造最小生成树效果较好。

  ⑺c加加提问,克鲁斯卡尔算法是什么

  ⑻克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(eloge)。和普里姆算法恰恰相反,更适合于求边稀疏的网的最小生成树。对于任意一个连通网的最小生成树来说,在要求总的权值最小的情况下,最直接的想法就是将连通网中的所有边按照权值大小进行升序排序,从小到大依次选择。由于最小生成树本身是一棵生成树,所以需要时刻满足以下两点:

  ⑼连接n个顶点在不产生回路的情况下,只需要n-条边。

  ⑽判断是否会产生回路的方法为:在初始状态下给每个顶点赋予不同的标记,对于遍历过程的每条边,其都有两个顶点,判断这两个顶点的标记是否一致,如果一致,说明它们本身就处在一棵树中,如果继续连接就会产生回路;如果不一致,说明它们之间还没有任何关系,可以连接。

  ⑾输入连通网的边数:输入连通网的顶点:输入各边的起始点和终点及权重:,,,,,,,,,,,,,,,,,,,,,,,,,

  ⑿数据结构当中的图怎么都弄不懂怎么办

  ⒀学习数据结构中的图参照以下步骤,对着书看,包会。学习先决条件:指针基础数组和链表图的基本概念(如边,顶点,路径,权值理解图的两大存储结构-邻接矩阵-邻接表注意:邻接表中,指针数组里的每一个指针都是一个单链表的头指针注意:单链表里每个节点里存储的是图中每条边的信息。理解图的遍历算法-深度优先遍历dfs注意:花半小时看懂dfs的递归代码。-宽度优先遍历bfs注意:又叫广度优先算法,需要一个队列,用非递归实现,请用半小时看懂实现代码。图的最小代价生成树算法-普里姆算法注意:把书上给的图文例子看懂。-克鲁斯卡尔算法注意:把书上给的图文例子看懂注意:克鲁斯卡尔的时间复杂度AOV和AOE网络-AOV拓扑排序算法过程注意:AOV和AOE都可以理解为一个工程图,工程由很多项目组成,项目直接有相互依赖。不同的是,AOV图中的顶点代表项目,对比后文的AOE。-AOE最长路径注意:与AOV相反,AOE用边来代表项目,因此边的权值可以理解为这个项目消耗的时间。图的最短路径算法-迪杰斯特拉算法注意:把书上给的图文例子看懂。注意:此算法求的是某个给定顶点到其他各顶点的最短路径(单源。-弗洛伊德算法注意:把书上的图文例子看懂。注意:此算法求的是图中所有顶点的两两最短路径。

  ⒁sh实现最小生成树和最短路径的算法

  ⒂图的最小生成树与最短路径的算法一、图的生成树与最小生成树在一个连通图G中,如果取它的全部顶点和一部分边构成一个子图G’,即:若边集E(G’中的边既将图中的所有顶点连通又不形成回路,则称子图G’是原图G的一棵生成树。最小生成树:给图中每个边赋一权值,所有生成树中所选择边的权值之和最小的生成树,称之为最小代价生成树,即是最小生成树。、普里姆算法.算法描述假设G=(V,E是一个具有n个顶点的连通网,T=(U,TE是G的最小生成树,其中U是T的顶点集,TE是T的边集,U和TE的初值均为空集。算法开始时,首先从V中任取一个顶点(假定取v,将它并入U中,此时U={v},然后只要U是V的真子集(即,就从那些其一个端点已在T中,另一个端点仍在T外的所有边中,找一条最短(即权值最小边,假定为(vi,vj,其中,并把该边(vi,vj和顶点vj分别并入T的边集TE和顶点集U,如此进行下去,每次往生成树里并入一个顶点和一条边,直到(n-次后就把所有n个顶点都并入到生成树T的顶点集中,此时U=V,TE中含有(n-条边,T就是最后得到的最小生成树。.关键问题普里姆算法的关键之处是:每次如何从生成树T中到T外的所有边中,找出一条最短边。例如,在第k次前,生成树T中已有k个顶点和(k-条边,此时T中到T外的所有边数为k(n-k,当然它包括两顶点间没有直接边相连,其权值被看作为“无穷大”的边在内,从如此多的边中查找最短边,其时间复杂性为O(k(n-k,显然是很费时的。是否有一种好的方法能够降低查找最短边的时间复杂性呢?.解决方法方法是:假定在进行第k次前已经保留着从T中到T外每一顶点(共(n-k个顶点的各一条最短边,进行第k次时,首先从这(n-k条最短边中,找出一条最最短的边(它就是从T中到T外的所有边中的最短边,假设为(vi,vj,此步需进行(n-k次比较;然后把边(vi,vj和顶点vj分别并入T中的边集TE和顶点集U中,此时T外只有n-(k+个顶点,对于其中的每个顶点vt,若(vj,vt边上的权值小于已保留的从原T中到vt的最短边的权值,则用(v,vt修改之,使从T中到T外顶点vt的最短边为(vj,vt,否则原有最短边保持不变,这样,就把第k次后从T中到T外每一顶点vt的各一条最短边都保留下来了。为进行第(k+次运算做好了准备,此步需进行(n-k-次比较。所以,利用此方法求第k次的最短边共需比较(n-k-次,即时间复杂性为O(n-k。.prim算法:设一个辅助数组closedge,以记录从U到V—U具有最小代价的边。数组中的每个元素closedge.vex存储该边依附的在U中的顶点。procmintree_prim(gn:adjmatrix;u:integer);beginforv:=tondoifv《》uthenwithclosedageclosedge.lowcast:=;{并入U集合}fori:=ton-dobeginv:=min(closedge);{寻找代价最小的边}write(closedge.lowcast:=;{并入U集合}fork:=tondoifgn.lowcastthenbeginclosedge.vex:=v;end;end;end;练习:prim算法实现【问题描述】从文件中读入连通带权图的信息,按prim算法求出该图的最小生成树,以V作为初始结点。【输入文件】第一行两个整数m和n,分别表示图的结点数和图中的边数。以下n行表示n条边:每一行三个数x、y和k,k表示x与y之间边的权值。【输出文件】共m行,第一行:最小生成树的权;以下m-行表示选取的边,边的第个结点小于第个结点,并按结点由小到大输出。【示例】输入:输出:练习:EddypaintingEddybeginstolikepaintingpicturesrecently,heissureofhimselftobeeapainter.EverydayEddydrawspicturesinhissmallroom,andheusuallyputsouthisnewestpicturestolethisfriendsappreciate.buttheresultitcanbeimagined,thefriendsarenotinterestedinhispicture.Eddyfeelsverypuzze,inordertochangeallfriends’sviewtohistechnicalofpaintingpictures,soEddycreatesaproblemforthehisfriendsofyou.Problemdescriptionsasfollows:Givenyousomecoordinatespiontsonadrawingpaper,everypointlinkswiththeinkwiththestraightline,causesallpointsfinallytolinkinthesameplace.Howmanydistantsdoesyourdutydiscovertheshortestlengthwhichtheinkdraws?Input:Thefirstlinecontains《n《=,thenumberofpoint.Foreachpoint,alinefollows;eachfollowinglinecontainstworealnumbersindicatingthe(x,y)coordinatesofthepoint.Inputcontainsmultipletestcases.Processtotheendoffile.Output:Yourprogramprintsasinglerealnumbertotwodecimalplaces:theminimumtotallengthofinklinesthatcanconnectallthepoints.SampleInput:......SampleOutput:.、克鲁斯卡尔算法.算法描述假设G=(V,E是一个具有n个顶点的连通网,T=(U,TE是G的最小生成树,U的初值等于V,即包含有G中的全部顶点,TE的初值为空。此算法的基本思想是,将图G中的边按权值从小到大的顺序依次选取,若选取的边使生成树T不形成回路,则把它并入TE中,保留作为T的一条边,若选取的边使生成树T形成回路,则将其舍弃,如此进行下去,直到TE中包含有n-条边为止。此时的T即为最小生成树。.关键问题克鲁斯卡尔算法的关键之处是:如何判断欲加入的一条边是否与生成树中已选取的边形成回路。这可将各顶点划分为所属集合的方法来解决,每个集合中的顶点表示一个无回路的连通分量。算法开始时,由于生成树的顶点集等于图G的顶点集,边集为空,所以n个顶点分属于n个集合。每个集合中只有一个顶点,表明顶点之问互不连通。.Kruskal算法:procmintree_krusk(gn:adjmatrix);beginfori:=tondoun:=i;fori:=ton-dobeginminedge(a,b);write(a,b,gn);k:=un;fori:=tondo{两个连通分量合并}ifun;end;end;.注意:procminedge(vara:integer;varb:integer);用于在剩下的边中选取不再同一连通分量上的最小代价的边,边的结点分别为a和b。为了实现该过程,可以将图中的边生成一边结点(包含两个顶点和代价数组,由小到大排序,然后通过排序后的数组进行处理;un数组:用来记载随着边的加入,各顶点属于哪个连通分量。练习:Kruskal算法实现【问题描述】从文件中读入连通带权图的信息,按Kruskal算法求出该图的最小生成树,以V作为初始结点。【输入文件】第一行两个整数m和n,分别表示图的结点数和图中的边数。以下n行表示n条边:每一行三个数x、y和k,k表示x与y之间边的权值。【输出文件】共m行,第一行:最小生成树的权;以下m-行表示选取的边,按选取边的权值由小到大输出。【示例】输入:输出:练习:判断最小生成树是否唯一Givenaconnectedundirectedgraph,tellifitsminimumspanningtreeisunique.Definition(SpanningTree):Consideraconnected,undirectedgraphG=(V,E).AspanningtreeofGisasubgraphofG,sayT=(V’,E’),withthefollowingproperties:.V’=V..Tisconnectedandacyclic.Definition(MinimumSpanningTree):Consideranedge-weighted,connected,undirectedgraphG=(V,E).TheminimumspanningtreeT=(V,E’)ofGisthespanningtreethathasthesmallesttotalcost.ThetotalcostofTmeansthesumoftheweightsonalltheedgesinE’.InputThefirstlinecontainsasingleintegert(《=t《=),thenumberoftestcases.Eachcaserepresentsagraph.Itbeginswithalinecontainingtwointegersnandm(《=n《=),thenumberofnodesandedges.Eachofthefollowingmlinescontainsatriple(xi,yi,wi),indicatingthatxiandyiareconnectedbyanedgewithweight=wi.Foranytwonodes,thereisatmostoneedgeconnectingthem.OutputForeachinput,iftheMSTisunique,printthetotalcostofit,orotherwiseprintthestring’NotUnique!’.SampleInputSampleOutputNotUnique!二、最短路径【问题描述】由于从一顶点到另一顶点可能存在着多条路径。每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。求图中一顶点vi到其余各顶点的最短路径和最短距离比较容易,只要从该顶点vi,出发对图进行一次广度优先搜索遍历,在遍历时记下每个结点的层次即可。若图是带权图(假定权值非负从源点vi到终点vj的每条路径上的权(它等于该路径上所经边上的权值之和,称为该路径的带权路径长度可能不同,我们把权值最小的那条路径也称做最短路径,其权值也称作最短路径长度或最短距离。实际上,这两类最短路径问题可合并为一类,这只要把第一类的每条边的权都设为就归属于第二类了,所以在以后的讨论中,若不特别指明,均是指第二类的最短路径问题。求图的最短路径问题包括两个子问题:一是求图中一顶点到其余各顶点的最短路径,二是求图中每对顶点之间的最短路径。下面分别进行讨论。始点终点最短路径路径长度vvNopathv(v,v)v(v,v,v)v(v,v)v(v,v,v,v)始点终点最短路径路径长度vV(v,v)V(v,v,v)V(v,v,v)v(v,v)、从一顶点到其余各顶点的最短路径.描述迪杰斯特拉(Dijkstra于年提出了解决此问题的一般算法,具体做法是按照从源点到其余每一顶点的最短路径长度的升序依次求出从源点到各顶点的最短路径及长度,每次求出从源点vi到一个终点vj的最短路径及长度后,都要以vj作为新考虑的中间点,用vi到vj的最短路径和最短路径长度对vi到其它尚未求出最短路径的那些终点的当前路径及长度作必要的修改,使之成为当前新的最短路径和最短路径长度,当进行n-次后算法结束。.Dijkstra算法:首先,引进一个辅助向量dist,dist为其上的权值,否则为最大值(计算机能表示。算法:()用邻接矩阵cost表示带权有向图。S表示已找到的从v出发的最短路径的终点的集合,初态为空。dist向量的初值为:dist;()选择vj,使得:dist|vi∈V-S};vj就是当前求得从v出发的最短路径的终点。S=S+{j};()修改从v出发到集合V-S上任意顶点vk可达的最短路径长度。ifdist;()重复()()共n-次。代码:procshort_dij;beginfori:=tondobegindist;ifdist:=-;end;flag:=true;fork:=ton-dobeginwm:=max;j:=v;fori:=tondoifnot(flag;end;flag)thenbegindist:=j;end;end;end;其中:cost:邻接矩阵;path:存储从v到顶点i的最短路径;是以集合作为数组元素;dist:存储相应路径长度;flag:表示已处理的顶点。练习:Dijkstra算法练习【问题描述】从文件中读入带权图的信息,按Dijkstra算法根据给定源点求出从源点法到该图中其余顶点的最短路径。【输入文件】第一行:一个整数L:L=表示无向图,L=表示有向图;第二行三个整数m、n和k,分别表示图的结点数、图中的边数以及源点。以下n行表示n条边:每一行三个数x、y和z,z表示x与y之间边的权值。【输出文件】共m-行,每一行的数据包括:顶点:最短路径:路径,如果不存在路径,数据为:顶点:Nopath。【示例】输入:输出::Nopath::::::::练习:路由选择问题【问题描述】X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径。遗憾的是,由于种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点。任务一:在己知故障节点的情况下,求避开这些故障节点,从节点I到节点J的最短路径S。任务二:在不考虑故障节点的情况下,求从节点I到节点J的最短路径S、第二最短路径S。【输入文件】第行:NIJ(节点个数起始节点目标节点)第—N+行:SkSk…SkN(节点K到节点J的距离为SkJK=,,……,N)最后一行:PTT……Tp(故障节点的个数及编号)【输出文件】SSS(S《=S从节点I到节点J至少有两条不同路径)【输入输出样例】route.inroute.out、每对顶点之间的最短路径求图中每对顶点之间的最短路径是指把图中任意两个顶点vi和vj(i≠j之间的最短路径都计算出来。解决此问题有两种方法:一是分别以图中的每个顶点为源点共调用n次迪杰斯特拉算法,此方法的时间复杂性为O(n;二是采用下面介绍的弗洛伊德(Floyed算法,此算法的时间复杂性仍为O(n,但比较简单。弗洛伊德算法实际上是一个动态规划的算法。从图的邻接矩阵开始,按照顶点v,v,…,vn的次序,分别以每个顶点vk(≤k≤n作为新考虑的中间点,在第k-次运算Ak-(A(为原图的邻接矩阵G的基础上,求出每对顶点vi到vj的最短路径长度计算公式为:Floyd算法:procshortpath_floyd;beginfori:=tondoforj:=tondobeginlength;iflength;end;fork:=tondofori:=tondoforj:=tondoiflengththenbeginlength;path;end;end;其中:cost为邻接矩阵;path:表示顶点i到j的最短路径;length:练习:Floyd算法练习【问题描述】从文件中读入带权图的信息,按Dijkstra算法根据给定源点求出从源点到该图中其余顶点的最短路径。【输入文件】第一行:一个整数L:L=表示无向图,L=表示有向图;第二行三个整数m、n,分别表示图的结点数和图中的边数。以下n行表示n条边:每一行三个数x、y和z,z表示x与y之间边的权值。第n+行:整数R,以下R行每行一个整数表示顶点标号作为源点。【输出文件】共R行,每一行的数据表示源点到其余顶点的距离,按顶点编号由小大输出,如果没有路径,输出-。【示例】输入:输出:--––

  ⒃你确定要用邻接表吗?因为在克鲁斯卡尔算法里只需要存储边及费用,用邻接表意义不大,还不好排序。以下给出并查集实现的克鲁斯卡尔算法,求解生成网络的最小费用,并输出生成网络里的路径。#include《iostream》#include《algorithm》usingnamespacestd;intp;intcho;structedge{intu,v,w;//u表示起始点编号,v表示终点编号,w表示该路径费用}e;intn,m;//n表示点的个数,m表示路径数voidInit(){inti;for(i=;i《=n;i++){p=i;rank=;}}boolcmp(edgea,edgeb){returna.w《b.w;}intFind(intt){if(p!=t){p);}returnp;}intUnion(inta,intb){intx,y;x=Find(a);y=Find(b);if(rank){p=x;}else{p=y;if(rank)rank++;}return;}intmain(){scanf(“%d%d“,&n,&m);inti,j;for(i=;i《m;i++){scanf(“%d%d%d“,&e.w);}Init();sort(e,e+m,cmp);intt=,ans=;for(i=;i《m;i++){if(Find(e.v)){t++;ans+=e.w;Union(e.v);cho=i;if(t==n-)break;}}printf(“%d

  ⒄“,ans);for(j=;j《=cho;j++){printf(“%d%d

  ⒅“,e.v);}return;}

  ⒆#include?《iostream》using?namespace?std;#define?MAX?#define?LEN?int?map;????//某点到某点两点间的的距离int?dist;??????????????//记录当前点到源点的最短路径长度int?mark;???????????//加入进来的点的集合?//初始化map为正无穷大void?init(){???????int?i,j;???????for(i=;i《LEN;i++){??????????????for(j=;j《LEN;j++){?????????????????????map=MAX;??????????????}???????}???????}//n:多少条路??start:起始点?void?myDijstra(int?n,int?start){???????int?i,j,min,k;???????for(i=;i《=n;i++){??????????????mark=;//没有点加入??????????????dist;//初始?????????????????????}???????mark=;//把起始点加进来???????dist=;???????for(i=;i《=n;i++){??????????????min=MAX;??????????????for(j=;j《=n;j++){?????????????????????if(!mark????????????????????????????min=dist;????????????????????????????k=j;//标记?????????????????????}??????????????}??????????????if(min==MAX)?????????????????????break;??????????????mark=;//把K加进来??????????????//做松弛操作??????????????for(j=;j《=n;j++){?????????????????????if(!mark){????????????????????????????dist;?????????????????????}??????????????}???????}}?int?main(){???????int?i,j,n,line;???????int?a,b,d;???????cin》》n》》line;???//输入点和边???????init();???????for(i=;i《line;i++){??????????????cin》》a》》b》》d;??//输入各边的权值??????????????if(map》d){?????????????????????map=d;??????????????}???????}???????myDijstra(n,);//调用方法???????//输出到的最短路径???????cout《《dist《《endl;???????return?;}

  ⒇#include《stdio.h》#include《stdlib.h》#include《iostream.h》#define?MAX_VERTEX_NUM?#define?OK?#define?ERROR?#define?MAX?typedef?struct?Arcell{????????double?adj;????}Arcell,AdjMatrix;typedef?struct{????????char?vexs;?//节点数组????????AdjMatrix?arcs;?//邻接矩阵????????int?vexnum,arum;?//图的当前节点数和弧数????}MGraph;typedef?struct?Pnode?//用于普利姆算法{????????char?adjvex;?//节点????????double?lowcost;?//权值????}Pnode,Closedge;?//记录顶点集U到V-U的代价最小的边的辅助数组定义typedef?struct?Knode?//用于克鲁斯卡尔算法中存储一条边及其对应的个节点{????????char?ch;?//节点????????char?ch;?//节点????????double?value;//权值????}Knode,Dgevalue;//---------------------------------------------------------------------------------int?CreateUDG(MGraph?&?G,Dgevalue?&?dgevalue);int?LocateVex(MGraph?G,char?ch);int?Minimum(MGraph?G,Closedge?closedge);void?MiniSpanTree_PRIM(MGraph?G,char?u);void?Sortdge(Dgevalue?&?dgevalue,MGraph?G);//-------------------------------------------------------------------------------int?CreateUDG(MGraph?&?G,Dgevalue?&?dgevalue)?//构造无向加权图的邻接矩阵{????????int?i,j,k;????????cout《《“请输入图中节点个数和边/弧的条数:“;????????cin》》G.vexnum》》G.arum;????????cout《《“请输入节点:“;????????for(i=;i《G.vexnum;++i)????????????????cin》》G.vexs;????????for(i=;i《G.vexnum;++i)//初始化数组????????????{????????????????for(j=;j《G.vexnum;++j)????????????????????{????????????????????????G.arcs.adj=MAX;????????????????????}????????????}????????cout《《“请输入一条边依附的定点及边的权值:“《《endl;????????for(k=;k《G.arum;++k)????????????{????????????????cin?》》?dgevalue.value;????????????????i?=?LocateVex(G,dgevalue.ch;????????????????j?=?LocateVex(G,dgevalue.ch;????????????????G.arcs.value;????????????????G.arcs.adj;????????????}????????return?OK;????}int?LocateVex(MGraph?G,char?ch)?//确定节点ch在图G.vexs中的位置{????????int?a?;????????for(int?i=;?i《G.vexnum;?i++)????????????{????????????????if(G.vexs?==?ch)????????????????????????a=i;????????????}????????return?a;????}void?MiniSpanTree_PRIM(MGraph?G,char?u)//普利姆算法求最小生成树{????????int?i,j,k;????????Closedge?closedge;????????k?=?LocateVex(G,u);????????for(j=;?j《G.vexnum;?j++)????????????{????????????????if(j?!=?k)????????????????????{????????????????????????closedge.adjvex?=?u;????????????????????????closedge.adj;????????????????????}????????????}????????closedge.lowcost?=?;????????for(i=;?i《G.vexnum;?i++)????????????{????????????????k?=?Minimum(G,closedge);????????????????cout《《“(“《《closedge.lowcost《《“)“《《endl;????????????????closedge.lowcost?=?;????????????????for(j=;?j《G.vexnum;?++j)????????????????????{????????????????????????if(G.arcs.lowcost)????????????????????????????{????????????????????????????????closedge;????????????????????????????????closedge.adj;????????????????????????????}????????????????????}????????????}????}int?Minimum(MGraph?G,Closedge?closedge)?//求closedge中权值最小的边,并返回其顶点在vexs中的位置{????????int?i,j;????????double?k?=?;????????for(i=;?i《G.vexnum;?i++)????????????{????????????????if(closedge.lowcost?《?k)????????????????????{????????????????????????k?=?closedge.lowcost;????????????????????????j?=?i;????????????????????}????????????}????????return?j;????}void?MiniSpanTree_KRSL(MGraph?G,Dgevalue?&?dgevalue)//克鲁斯卡尔算法求最小生成树{????????int?p,p,i,j;????????int?bj;?//标记数组????????for(i=;?i《G.vexnum;?i++)?//标记数组初始化????????????????bj=i;????????Sortdge(dgevalue,G);//将所有权值按从小到大排序????????for(i=;?i《G.arum;?i++)????????????{????????????????p?=?bj;????????????????p?=?bj;????????????????if(p?!=?p????????????????????{????????????????????????cout《《“(“《《dgevalue.value《《“)“《《endl;????????????????????????for(j=;?j《G.vexnum;?j++)????????????????????????????{????????????????????????????????if(bj?==?p????????????????????????????????????????bj?=?p;????????????????????????????}????????????????????}????????????}????}void?Sortdge(Dgevalue?&?dgevalue,MGraph?G)//对dgevalue中各元素按权值按从小到大排序{????????int?i,j;????????double?temp;????????char?ch,ch;????????for(i=;?i《G.arum;?i++)????????????{????????????????for(j=i;?j《G.arum;?j++)????????????????????{????????????????????????if(dgevalue.value)????????????????????????????{????????????????????????????????temp?=?dgevalue.value;????????????????????????????????dgevalue.value;????????????????????????????????dgevalue.value?=?temp;????????????????????????????????ch?=?dgevalue.ch;????????????????????????????????dgevalue.ch;????????????????????????????????dgevalue.ch?=?ch;????????????????????????????????ch?=?dgevalue.ch;????????????????????????????????dgevalue.ch;????????????????????????????????dgevalue.ch?=?ch;????????????????????????????}????????????????????}????????????}????}void?main(){????????int?i,j;????????MGraph?G;????????char?u;????????Dgevalue?dgevalue;????????CreateUDG(G,dgevalue);????????cout《《“图的邻接矩阵为:“《《endl;????????for(i=;?i《G.vexnum;?i++)????????????{????????????????for(j=;?j《G.vexnum;?j++)????????????????????????cout?《《?G.arcs.adj《《“?“;????????????????cout《《endl;????????????}????????cout《《“=============普利姆算法===============

  ⒈“;????????cout《《“请输入起始点:“;????????cin》》u;????????cout《《“构成最小代价生成树的边集为:

  ⒉“;????????MiniSpanTree_PRIM(G,u);????????cout《《“============克鲁斯科尔算法=============

  ⒊“;????????cout《《“构成最小代价生成树的边集为:

  ⒋“;????????MiniSpanTree_KRSL(G,dgevalue);????}

  ⒌数据结构复习总结第七章图

  ⒍图G是由顶点集V和边集E组成顶点集是有穷非空集边集是有穷集;

  ⒎G中每条边都有方向称有向图;有向边称弧;边的始点称弧尾;边的终点称弧头;G中每条边都没有方向的称无向图

  ⒏顶点n与边数e的关系无向图的边数e介于~n(n)/之间有n(n)/条边的称无向完全图;

  ⒐有向图的边数e介于~n(n)之间有n(n)条边的称有向完全图;

  ⒑无向图中顶点的度是关联与顶点的边数;有向图中顶点的度是入度与出度的和

  ⒒所有图均满足所有顶点的度数和的一半为边数

  ⒓图G(VE)如V是V的子集E是E的子集且E中关联的顶点均在V中则G(VE)是G的子图

  ⒔在有向图中从顶点出发都有路径到达其它顶点的图称有根图;

  ⒕在无向图中任意两个顶点都有路径连通称连通图;极大连通子图称连通分量;

  ⒖在有向图中任意顺序两个顶点都有路径连通称强连通图;极大连通子图称强连通分量;

  ⒗将图中每条边赋上权则称带权图为网络

  ⒘邻接矩阵是表示顶点间相邻关系的矩阵n个顶点就是n阶方阵

  ⒙无向图是对称矩阵;有向图行是出度列是入度

  ⒚对图中所有顶点把与该顶点相邻接的顶点组成一个单链表称为邻接表adjvex|next如要保存顶点信息加入data;

  ⒛对所有顶点设立头结点vertex|firstedge并顺序存储在一个向量中;vertex保存顶点信息firstedge保存邻接表头指针

  邻接矩阵表示法与邻接表表示法的比较

  )邻接矩阵是唯一的邻接表不唯一;

  )存储稀疏图用邻接表存储稠密图用邻接矩阵;

  )求无向图顶点的度都容易求有向图顶点的度邻接矩阵较方便;

  )判断是否是图中的边邻接矩阵容易邻接表最坏时间为O(n);

  )求边数e邻接矩阵耗时为O(n^)与e无关邻接表的耗时为O(e+n);

  图的深度优先遍历类似与树的前序遍历按访问顶点次序得到的序列称DFS序列

  对邻接表表示的图深度遍历称DFS时间复杂度为O(n+e);对邻接矩阵表示的图深度遍历称DFSM时间复杂度为O(n^);

  图的广度优先遍历类似与树的层次遍历按访问顶点次序得到的序列称BFS序列

  对邻接表表示的图广度遍历称BFS时间复杂度为O(n+e);对邻接矩阵表示的图广度遍历称BFSM时间复杂度为O(n^);

  将没有回路的连通图定义为树称自由树

  连通图G的一个子图若是一棵包含G中所有顶点的树该子图称生成树

  有DFS生成树和BFS生成树BFS生成树的高度最小

  非连通图生成的是森林

  将权最小的生成树称最小生成树(是无向图的算法)

  )确定顶点S初始化候选边集T;formvex|tovex|lenght

  )选权值最小的T与第条记录交换;

  )从T中将tovex取出替换以下记录的fromvex计算权;若权小则替换否则不变;

  )选权值最小的T与第条记录交换;

  )从T中将tovex取出替换以下记录的fromvex计算权;若权小则替换否则不变;

  初始化时间是O(n)选轻边的循环执行nk次调整轻边的循环执行nk;算法的时间复杂度为O(n^)适合于稠密图

  )初始化确定顶点集和空边集;对原边集按权值递增顺序排序;

  )取第条边判断边的个顶点是不同的树加入空边集否则删除;

  对边的排序时间是O(eloge);初始化时间为O(n);执行时间是O(loge);算法的时间复杂度为O(eloge)适合于稀疏图

  路径的开始顶点称源点路径的最后一个顶点称终点;

  单源最短路径问题已知有向带权图求从某个源点出发到其余各个顶点的最短路径;

  单目标最短路径问题将图中每条边反向转换为单源最短路径问题;

  单顶点对间最短路径问题以分别对不同顶点转换为单源最短路径问题;

  所有顶点对间最短路径问题分别对图中不同顶点对转换为单源最短路径问题;

  )选取D最小的顶点加入顶点集;

  )计算非顶点集中顶点的路径权集;

  算法的时间复杂度为O(n^)

  对一个有向无环图进行拓扑排序是将图中所有顶点排成一个线性序列满足弧尾在弧头之前这样的线性序列称拓扑序列

  总是选择入度为的结点输出并删除该顶点的所有边设置各个顶点入度时间是O(n+e)设置栈或队列的时间是O(n)算法时间复杂度为O(n+e)

  总是选择出度为的结点输出并删除该顶点的所有边设置各个顶点出度时间是O(n+e)设置栈或队列的时间是O(n)算法时间复杂度为O(n+e)求得的是逆拓扑序列

  *************************************************************************************

  图的逻辑结构特征就是其结点(顶点)的前趋和后继的个数都是没有限制的即任意两个结点之间之间都可能相关

  图GraphG=(VE)V是顶点的有穷非空集合E是顶点偶对的有穷集

  有向图Digraph每条边有方向;无向图Undigraph每条边没有方向

  有向完全图具有n*(n)条边的有向图;无向完全图具有n*(n)/条边的无向图;

  有根图有一个顶点有路径到达其它顶点的有向图;简单路径是经过顶点不同的路径;简单回路是开始和终端重合的简单路径;

  *************************************************************************************

  图的存储结构·邻接矩阵表示法用一个n阶方阵来表示图的结构是唯一的适合稠密图·无向图邻接矩阵是对称的

  ·有向图行是出度列是入度

  建立邻接矩阵算法的时间是O(n+n^+e)其时间复杂度为O(n^)

  ·邻接表表示法用顶点表和邻接表构成不是唯一的适合稀疏图·顶点表结构vertex|firstedge指针域存放邻接表头指针

  ·邻接表用头指针确定·无向图称边表;

  ·有向图又分出边表和逆邻接表;

  ·邻接表结点结构为adjvex|next

  时间复杂度为O(n+e)空间复杂度为O(n+e)

  图的遍历·深度优先遍历借助于邻接矩阵的列使用栈保存已访问结点

  ·广度优先遍历借助于邻接矩阵的行使用队列保存已访问结点

  *************************************************************************************

  生成树的定义若从图的某个顶点出发可以系统地访问到图中所有顶点则遍历时经过的边和图的所有顶点所构成的子图称作该图的生成树

  最小生成树图的生成树不唯一从不同的顶点出发可得到不同的生成树把权值最小的生成树称为最小生成树(MST)

  构造最小生成树的算法·Prim算法的时间复杂度为O(n^)与边数无关适于稠密图

  ·Kruskal算法的时间复杂度为O(lge)主要取决于边数较适合于稀疏图

  *************************************************************************************

  最短路径的算法·Dijkstra算法时间复杂度为O(n^)·类似于prim算法

  *************************************************************************************

  拓扑排序是将有向无环图G中所有顶点排成一个线性序列若∈E(G)则在线性序列u在v之前这种线性序列称为拓扑序列

  拓扑排序也有两种方法·无前趋的顶点优先每次输出一个无前趋的结点并删去此结点及其出边最后得到的序列即拓扑序列lishixinzhi/Article/program/sjjg//

您可能感兴趣的文章:

相关文章