博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最短路问题
阅读量:4306 次
发布时间:2019-06-06

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

描述:小明到小华家有许多条路可以走,现在给出所有能够到达他家的路线,并给出每条线段的长度,求出小明到小华家的最短路线!

介绍第一种学习方法:dijkstra算法

顶点集分为两组,第一组为:已求出最短路径的顶点集合

        第二组为:其余未确定最短路径的顶点集合

按照最短路径长度递增次序把第二组中的顶点依次加入到第一组中

#include
#include
#include
#include
#include
#include
#include
using namespace std;#define N 110#define MAX 999999#define CLR(arr, what) memset(arr, what, sizeof(arr))int nodenum, edgenum; int map[N][N], dis[N];bool visit[N];int Dijkstra(int src, int des){ int temp, k; CLR(visit, false); int i = 1 ; for(; i <= nodenum; ++i) dis[i] = (i == src ? 0 : map[src][i]); visit[src] = true; dis[src] = 0; for(i = 1; i<= nodenum; ++i) { temp = MAX; int j = 1 ; for(; j <= nodenum; ++j) if(!visit[j] && temp > dis[j]) temp = dis[k = j]; if(temp == MAX) break; visit[k] = true; for(j = 1; j <= nodenum; ++j) if(!visit[j] && dis[j] > dis[k] + map[k][j]) dis[j] = dis[k] + map[k][j]; } return dis[des];}int main(){ int start, end, cost; int answer; while(~scanf("%d%d", &nodenum, &edgenum) && (nodenum + edgenum)) { int i = 1 ; for(; i <= nodenum; ++i) for(int j = 1; j <= nodenum; ++j) map[i][j] = MAX; for(i = 1; i <= edgenum; ++i) { scanf("%d%d%d", &start, &end, &cost); if(cost < map[start][end]) map[start][end] = map[end][start] = cost; } answer = Dijkstra(1, nodenum); printf("%d\n", answer); } return 0;}

 

转载于:https://www.cnblogs.com/NYNU-ACM/p/4237463.html

你可能感兴趣的文章
201521123061 《Java程序设计》第十一周学习总结
查看>>
代码小思考
查看>>
Unity中的销毁方法
查看>>
ceph删除pool提示(you must first set the mon_allow_pool_delete config option to true)解决办法...
查看>>
2016-7-15(1)使用gulp构建一个项目
查看>>
文件上传案例——客户端和服务端套接字
查看>>
模拟BS服务器
查看>>
Lambda表达式——注重过程的编程思想
查看>>
网络通信和网络编程
查看>>
转换流
查看>>
序列化流
查看>>
线程池
查看>>
Junit单元测试
查看>>
Stream流思想和常用方法
查看>>
Stream流方法引用
查看>>
反射应用和获取Class对象的三种方式
查看>>
Spring框架
查看>>
JSP
查看>>
Session会话技术
查看>>
session案例之验证码
查看>>