博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6)图[6]各顶点之间的最短路径
阅读量:5824 次
发布时间:2019-06-18

本文共 3242 字,大约阅读时间需要 10 分钟。

有向图图中任何两个可到达的顶点之间最短路径以及相应的长度

Dijkstra算法 和Floyd算法

 

1 #include "iostream"  2 #include "vector"  3 #include "stdlib.h"  4 using namespace std;  5   6 const int MaxNumVertex  = 20; //最大顶点数  7 const int infinity = 65535;//无穷大  8 typedef int elementtype;       //elementtype 为int 型  9 class graph{ 10 public: 11     graph(); 12     ~graph(); 13     elementtype insertvertex(elementtype v); //在图中增加一个顶点 14     elementtype insertedge(elementtype v,elementtype u,elementtype weight);//在图中增加一条从v顶点到u顶点的弧 15     elementtype firstadj(elementtype v);//求图g中顶点v的第一个邻接点 16     elementtype nextadj(elementtype v,elementtype m);//求图中顶点v的m邻接点之后的邻接点 17     elementtype degreeout(elementtype v);//求图中顶点v的出度数 18     elementtype FindDegreeout(elementtype oud[]);//各顶点的入度存放于出度数组中 19     elementtype Dijkstra(elementtype v0);//求解从v0到各顶点的最短路径 20     elementtype Floyd();//各顶点之间最短路径以及长度 21     elementtype create();//创建图 22     int  CurrentVertex;//当前顶点数 23  24 private: 25     elementtype vertex[MaxNumVertex];//顶点表 26     elementtype edge[MaxNumVertex][MaxNumVertex];//图中弧的类型 27      28 }; 29  30 /* 31 *初始化 32 */ 33 graph::graph() 34 { 35     CurrentVertex = 0;  36     int i,j; 37     for (i=MaxNumVertex-1;i>=1;i--) 38     { 39         for (j=MaxNumVertex-1;j>=1;j--) 40         { 41             edge[i][j] = infinity; 42  43         } 44     } 45      46 } 47  48 /* 49 *在图中增加一个顶点 50 */ 51 elementtype graph::insertvertex(elementtype v) 52 { 53     //判断这个顶点是否已经存在 54     int i; 55     bool flags = true; 56     for(i=1; i<=CurrentVertex; i++) 57     { 58         if(vertex[i]==v) 59         { 60             flags = false; 61             break; 62         } 63     } 64      65     if(flags) 66     { 67         CurrentVertex++; 68         vertex[CurrentVertex] = v; 69     }else{ 70         cout<
<<"顶点已经存在!"<
"<
<<"这条弧弧已经存在!"<
>path(MaxNumVertex);//存储v0到各顶点的路径163 for(i=1;i<=CurrentVertex;i++)164 {165 solved[i] = false;166 }167 168 solved[v0] = true;//将v0设置为已解顶点169 for(i=1;i<=CurrentVertex;i++)170 {171 if(edge[v0][i]!=infinity)172 {173 dist[i] = edge[v0][i];174 path[i].push_back(v0);175 path[i].push_back(i);176 }else{177 dist[i] = infinity;178 }179 }180 181 for(i=1;i
"<
<<"]:"<
<
"<
<<"]:";215 for(j=0;j
>> path(MaxNumVertex,vector
>(MaxNumVertex));//存储两个顶点之间的额路径233 for(i=1;i<=CurrentVertex;i++)//初始化路径矩阵path234 {235 for(j=1;j<=CurrentVertex;j++)236 {237 if(edge[i][j]!=infinity)238 {239 path[i][j].push_back(i);240 path[i][j].push_back(j);241 }242 }243 }244 245 for(k=1;k<=CurrentVertex;k++)//控制edge'k的求解246 {247 for(i=1;i<=CurrentVertex;i++)//求解edge'k[i][j]248 {249 for(j=1;j<=CurrentVertex;j++)250 {251 if(i!=j)252 {253 if(edge[i][k]+edge[k][j]
0)&&(i!=j))276 {277 cout<<"dist["<
<<"->"<
<<"]:"<
<
"<
<<"]:";279 for(k=0;k
>numv;300 cout<<"input vertex(顶点):";301 for(i=1;i<=numv;i++)302 {303 cin>>v;304 insertvertex(v);305 }306 cout<<"input num(u,v,weight)(弧的数目):";307 cin>>numv;308 for(i=1;i<=numv;i++)309 {310 cout<<"u->v,weight:";311 cin>>u>>v>>weight;312 insertedge(u,v,weight);313 }314 cout<<"graph create finish!"<
<
>selected)331 {332 switch(selected)333 {334 case 1:335 for(i=1;i<=g.CurrentVertex;i++)336 {337 if(outd[i]!=0)338 {339 g.Dijkstra(i);340 cout<

 

 

 

 

 

转载于:https://www.cnblogs.com/minmsy/p/5016633.html

你可能感兴趣的文章
最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
查看>>
Hadoop生态圈-Kafka常用命令总结
查看>>
如何基于Redis Replication设计并实现Redis-replicator?
查看>>
Linux 环境下 PHP 扩展的编译与安装 以 mysqli 为例
查看>>
浮点数内存如何存储的
查看>>
贪吃蛇
查看>>
EventSystem
查看>>
用WINSOCK API实现同步非阻塞方式的网络通讯
查看>>
玩一玩博客,嘿嘿
查看>>
P1352 没有上司的舞会
查看>>
ios11文件夹
查看>>
【HLOJ 559】好朋友的题
查看>>
Electric Fence(皮克定理)
查看>>
nvl 在mysql中如何处理
查看>>
MyEclipse 快捷键
查看>>
快速傅里叶变换FFT
查看>>
大数据常用基本算法
查看>>
JavaScript学习笔记(十三)——生成器(generator)
查看>>
hibernate保存失败
查看>>
MySQL增量订阅&消费组件Canal POC
查看>>