最短路径是一个很常见的问题,这里有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. Java jre7及以上版本中的switch支持String的实现细节

    Java7中的switch支持String的实现细节 作者: zsxwing 更新: 2013-03-04 21:08:02 发布: 2012-04-26 13:58:19 在Java7之前,swit ...

  2. 【译】x86程序员手册16-5.3联合使用段与分页转换

    5.3 Combining Segment and Page Translation  联合使用段与分页转换 Figure 5-12 combines Figure 5-2 and Figure 5- ...

  3. Java_Web三大框架之Struts2

    今天正式接触Java_Web三大框架之Struts2框架.对于初学者来说,先来了解什么是框架技术: 一.“框架技术”帮我们更快更好地构建程序: 1.是一个应用程序的半成品 2.提供可重用的公共结构 3 ...

  4. 8、scala面向对象编程之对象

    1.  Object 2.伴生对象 3.让object继承抽象类 4.apply方法 5.main方法 6.用object实现枚举功能 1.  Object Object,相当于class的单个实例, ...

  5. Ubuntu14.4安装mysql

    一.安装 apt-get install mysql-server mysql-client 设置用户名和密码 二.检查 sudo service mysql restart 三.支持 1.apach ...

  6. 4.用Redis Desktop Manager连接Redis(Windows)

    相比连接CentOS的Redis,在Windows中的操作简单得让人感动. 所以这里我们使用的服务器系统是Windows Server 2016 R2. 而Windows版本的Redis官方网站并没有 ...

  7. 安装nodejs6.9x以后,原来在nodejs4.2.x中运行正常的ionic项目出现问题的解决

    安装nodejs6.9x以后,原来在nodejs4.2.x中运行正常的程序出现的问题.看错误信息,由于NodeJs版本升级导致的. 到提示的目录下运行:npm rebuild node-sass -g ...

  8. CDR真实图片转水墨画效果制作教程

    CorelDRAW创造性滤镜组是最具有创造力的滤镜,使用里面的散开滤镜能够实现类似于水墨的表现手法,然后再结合图层的合并模式,让您的图片产生意想不到的视觉效果.本文将利用CorelDRAW软件中提供的 ...

  9. mysql动态执行sql批量删除数据

    CREATE PROCEDURE `sp_delete_pushmsg_data`() BEGIN ); ); declare l_dutyno int; ; ; ; ; day),'%Y-%m-%d ...

  10. office 2016最新安装及激活教程(KMS)【亲测有效】!!

    前言 博主的一个朋友,咳咳--你们懂得,想装office,于是我就上网找了一下激活的方法,亲测有效,而且也没有什么广告病毒之类的,还比较方便,所以传上来方便大家.好了,进入正题: 安装office 首 ...