博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最爱的城市
阅读量:3930 次
发布时间:2019-05-23

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

 最爱的城市

时间限制: 1 Sec  内存限制: 32 MB

 

题目描述

一天小明捧着一本世界地图在看,突然小明拿起笔,将他最爱的那些城市标记出来,并且随机的将这些城市中的某些用线段两两连接起来。

小明量出了每条线段的长度,现在小明想知道在这些线段组成的图中任意两个城市之间的最短距离是多少。

输入

输入包含多组测试数据。

每组输入第一行为两个正整数n(n<=10)和m(m<=n*(n-1)/2),n表示城市个数,m表示线段个数。
接下来m行,每行输入三个整数a,b和l,表示a市与b市之间存在一条线段,线段长度为l。(a与b不同)
每组最后一行输入两个整数x和y,表示问题:x市与y市之间的最短距离是多少。(x与y不同)
城市标号为1~n,l<=20。

输出

对于每组输入,输出x市与y市之间的最短距离,如果x市与y市之间非连通,则输出“No path”。

样例输入

4 41 2 41 3 11 4 12 3 12 4

样例输出

3

徐不可说:这是一道迪杰斯特拉算法求最短路径的模板题,很经典,只需将已知各城市之间距离抽象成图,运用迪杰斯特拉算法解即可,当然用prim、kruskal的话变形一下也应该问题不大。accept很简单,对算法的深入理解才是最重要的。

迪杰斯特拉ac代码如下:

#include
using namespace std;const int maxn=15;int mp[maxn][maxn];const int inf =0x3f3f3f3f;int n,m;int dij(int s,int t){ //套用迪杰斯特拉算法的模板 不断更新位置来确定最短路径 int dis[maxn],vis[maxn]; for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0; dis[s]=0; for(int i=1;i<=n;i++){ int k=-1,min=inf; for(int j=1;j<=n;j++){ if(!vis[j]&&min>dis[j]) //vis[j]为0才能进行,也就是说每个点最终都会进行更新 min=dis[k=j]; //每次挑选最小的dis的点继续更新与之连通的其他点的dis,并标记k=-1; //min=dis[j],k=j; } if(k==-1) break; //全图完成遍历 退出 返回求出的最短路径dis[t] vis[k]=1; for(int j=1;j<=n;j++) if(dis[j]>dis[k]+mp[k][j]) dis[j]=dis[k]+mp[k][j]; //首次执行仅仅更新了与s连通的点的dis } return dis[t];}int main(){ while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++){ for (int j=1;j<=n;j++) mp[i][j]=inf; } for (int i=1;i<=m;i++){ int a,b,w; scanf("%d%d%d",&a,&b,&w); mp[a][b]=mp[b][a]=w; } int x,y; scanf("%d%d",&x,&y); int ans=dij(x,y); if(ans==inf){ printf("No path\n"); } else {printf("%d\n",ans); } }}

 

转载地址:http://qxtgn.baihongyu.com/

你可能感兴趣的文章
16.让对话框支持拖拽操作/目录框打开操作
查看>>
电影天堂爬虫
查看>>
sql练习--查找所有已经分配部门的员工的last_name和first_name
查看>>
sql练习--查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
查看>>
sql练习-获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。
查看>>
sql练习--查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
查看>>
Transformer-based Object Re-Identification论文解读
查看>>
Android BLE开发
查看>>
Java内部类详解
查看>>
Android开发常见面试题类型
查看>>
2017美团校招安卓岗
查看>>
YUV基础知识《转载》
查看>>
C语言动态申请内存
查看>>
cmake万能模板
查看>>
让你不再害怕指针——C指针详解
查看>>
十张图解释机器学习的基本概念
查看>>
红黑树:自平衡的二叉查找树
查看>>
回收站功能在 Linux 中的实现
查看>>
数据包头分析---网络字节序与主机字节序
查看>>
linux sh/bash 编程常用
查看>>