博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSL-ZYC 采购特价商品【SPFA】
阅读量:5148 次
发布时间:2019-06-13

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

题目大意:

给出每个点的坐标,求出SSTT的最短路。
InputInput

50 02 02 20 23 151 21 31 42 53 51 5

OutoutOutout

3.41

思路:

n100n⩽100FloydFloydDijkstraDijkstraSPFASPFA都可以轻松跑过。
先用勾股求出有连边的点之间的距离,双向存边,再跑一便最短路即可。
这道题是无向图而不是有向图!


代码:

#include 
#include
#include
#include
using namespace std;const double inf=99999999;int vis[501],head[501],n,m,x[501],y[501],s,t,k,X,Y;double dis[501];struct edge { int next,to; double dis; //边长是实数}e[50001];double Dis(int xx,int yy) //勾股求距离{ return sqrt((double)(x[xx]-x[yy])*(x[xx]-x[yy])+(y[xx]-y[yy])*(y[xx]-y[yy]));}void add(int from,int to,double Dis) //建图{ k++; e[k].next=head[from]; e[k].dis=Dis; e[k].to=to; head[from]=k;}void spfa() { queue
q; //队列,orz手写队列的dalao for (int i=1;i<=n;i++) //初始化 { vis[i]=0; dis[i]=inf; } q.push(s); //插入起始点 vis[s]=1; dis[s]=0; while (q.size()) //相当于 while(!q.empty()) { int u=q.front(); //取出队首 q.pop(); //弹出 vis[u]=0; for (int i=head[u];i;i=e[i].next) //邻接表 { int v=e[i].to; if (dis[v]>dis[u]+e[i].dis) //更新最短路 { dis[v]=dis[u]+e[i].dis; if (!vis[v]) { vis[v]=1; q.push(v); //入队 } } } }}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%d%d",&X,&Y); add(X,Y,Dis(X,Y)); add(Y,X,Dis(X,Y)); //无向图,建两次边 } scanf("%d%d",&s,&t); spfa(); printf("%0.2lf\n",dis[t]); return 0;}

转载于:https://www.cnblogs.com/hello-tomorrow/p/9313053.html

你可能感兴趣的文章
「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?
查看>>
jQuery 给div绑定单击事件
查看>>
Exceptionless 生产部署笔记
查看>>
有关快速幂取模
查看>>
转 ObjExporter Unity3d导出场景地图寻路
查看>>
Linux运维必备工具
查看>>
Ubuntu配置ssh及vnc
查看>>
C语言进阶——const 和 volatile 分析09
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
一步步学Mybatis-搭建最简单的开发环境-开篇(1)
查看>>
微信小程序图片上传
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
centos6.7 配置外网端口映射
查看>>
淡定,啊。数据唯一性
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>