最短路径是一个很常见的问题,这里有3种方法,可供参考。

一.Dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[][];
double c[];
bool b[];
double f[][];
int n,i,j,k,x,y,m,s,e;
double minl;
double maxx = 1e30;
int main()
{
cin >> n;
for (i = ; i <= n; i++)
cin >> a[i][] >> a[i][];
for (i = ; i <= n; i++)
for(j = ; j <= n; j++)
f[i][j] = maxx;
cin >> m;
for (i = ; i <= m; i++)
{
cin >> x >> y;
f[x][y] = f[y][x] = sqrt(pow(double(a[x][]-a[y][]),)+pow(double(a[x][]-a[y][]),));
}
cin>>s>>e;
for(int i = ;i <= n;i++)
{
c[i] = f[s][i];
}
memset(b,false,sizeof(b));
b[s] = true;
c[s] = ;
for(int i = ;i <= n;i++)
{
minl = maxx;
k = ;
for(int j = ;j <= n;j++)
{
if(b[j] == false && c[j] < minl)//没走过的路程最小的点
{
minl = c[j];
k = j;
}
}
if(k == )
break;
b[k] = true;
for(int j = ;j <= n;j++) //将所以能变的点最小路程全变了
{
if(c[k] + f[k][j] < c[j])
c[j] = c[k] + f[k][j];
}
}
printf("%.2lf",c[e]);
return ;
}
二.Floyed
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double f[][];
int a[][];
int m,n,x,y,r,s,e;
int main()
{
memset(f,,sizeof(f));
cin>>n;
for(int i = ;i <= n;i++)
{
cin>>a[i][]>>a[i][];
}
cin>>m;
for(int i = ;i <= m;i++)
{
cin>>x>>y;
f[y][x] = f[x][y] = sqrt(pow(double(a[x][]-a[y][]),)+pow(double(a[x][]-a[y][]),));
}
cin>>s>>e;
for(int k = ;k <= n;k++)
{
for(int i = ;i <= n;i++)
{
for(int j = ;j <= n;j++)
{
if(f[i][j] > f[i][k] + f[k][j] && i != j && i != k && j != k)
f[i][j] = f[i][k] + f[k][j];
}
}
}
printf("%.2lf",f[s][e]);
return ;
}
/*
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
*/
三.SPFA
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,p,c,i,j,x,y,t,min1,head,tail,tot,u;
int a[][],b[],dis[],num[],w[][];
queue <int> team;
bool exist[];
int main()
{
cin>>n>>p>>c;
for(i=;i<=p;i++)
{
b[i]=;
num[i]=;
for(j=;j<=p;j++)
w[i][j]=0x7fffffff/;
}
for(i = ;i <= n;i++)
cin>>b[i];
for(i=;i<=c;i++) //邻接矩阵存储
{
cin>>x>>y>>t;
w[x][y] = t;
a[x][++num[x]] = y;
a[y][++num[y]] = x;
w[y][x] = w[x][y];
}
min1=0x7fffffff/;
for(i=;i<=p;i++)
{
for(j=;j<=p;j++) dis[j]=0x7fffffff/; //队列数组初始化
memset(exist,false,sizeof(exist)); //exist标志初始化
dis[i]=;
exist[i]=true;
team.push(i);
while(!team.empty())
{
u = team.front();
team.pop();
exist[u] = true;
for(int j = ;j <= num[u];j++)
{
if(dis[a[u][j]] > dis[u] + w[u][a[u][j]])
{
dis[a[u][j]] = dis[u] + w[u][a[u][j]];
if(!exist[a[u][j]])
{
team.push(a[u][j]);
a[u][j] = true;
}
}
}
}
tot=;
for(j=;j<=n;j++)
tot+=dis[b[j]];
if (tot<min1) min1=tot;
}
cout<<min1;
return ;
}

最短路--Dijkstra&&Floyed&&SPFA的更多相关文章

  1. hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

    Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案 ...

  2. UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)

    传送门: http://www.qscoj.cn/#/problem/show/1987 童心未泯的帆宝和乐爷 Edit Time Limit: 10000 MS     Memory Limit: ...

  3. Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化)

    Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回 ...

  4. hdu 2544 最短路 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...

  5. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

  6. 单源最短路dijkstra算法&&优化史

    一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...

  7. HUD.2544 最短路 (Dijkstra)

    HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...

  8. 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)

    layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...

  9. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

随机推荐

  1. iOS开发中如何实现同步、异步、GET、POST等请求实操演示!

    1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...

  2. java 向上,向下转型

    在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...

  3. How an SSL connection is established

    An SSL connection between a client and server is set up by a handshake, the goals of which are: To s ...

  4. Django中图片的上传并显示

    一.settings配置文件中配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').replace('\\', ...

  5. PHP 之ip查询接口

    /** * @param $ip 待查询的ip * @return mixed */ function getIpAddressInfo($ip) { $ipurl = 'http://api.ip1 ...

  6. 小白学习Spark系列五:scala解析多级json格式字符串

    一.背景 处理json格式的字符串,key值一定为String类型,但value不确定是什么类型,也可能嵌套json字符串,以下是使用 JSON.parseFull 来解析多层json. 二.实例代码 ...

  7. Xcode 插件因为UUID原因不能使用解决办法

    Xcode 经常因为一些原因不能使用,需要重新在  ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins目录下对每一个插件包下的p ...

  8. gitlab的添加密钥

    1.在本地电脑下载git的客户端并且安装 2.鼠标右键左面选中Git Bash Here 3.操作如下图生成密钥 4.将密钥复制过来添加到gitLab中 5.Eclipse配置密钥 6.在git创建的 ...

  9. zk strom 本地环境启动命令

    bin/zkServer.sh statusbin/zkServer.sh startbin/storm nimbus &bin/storm ui &bin/storm drpc &a ...

  10. namespace的作用及用法

    namespace 所谓namespace,是指标识符的可见范围.C++标准库中的所有标识符都被定义在一个名为 std 的namespace 中. 一.<iostream>和<ios ...