最短路径是一个很常见的问题,这里有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. ProE常用曲线方程:Python Matplotlib 版本代码(玫瑰曲线)

    Pyplot教程:https://matplotlib.org/gallery/index.html#pyplots-examples 玫瑰曲线 文字描述 平面内,围绕某一中心点平均分布整数个正弦花瓣 ...

  2. AcDbTable 类

    Table 例子学习笔记在这个例子中,ARX向我们展示了ACDBTABLE类的一些基本操作方法,ACDBTABLE类是ACAD2005及其以后的产品,应该是说ACDBDATATABLE的升级产品,Ac ...

  3. windows设置右键菜单

    1. 打开注册表,(win + R,输入regedit) 2. 在 HKEY_CLASSES_ROOT\Directory\Background\shell 中,新建项:如(cmder),在 cmde ...

  4. 为Unity的新版ugui的Prefab生成预览图

    using UnityEngine;using System.Collections;using UnityEditor;using System.IO; [CustomPreview(typeof( ...

  5. 28 I/O限制的异步操作

    28.2 C#的异步函数 private static async Task<string> IssueClientRequestAsync(string serverName, stri ...

  6. WebService附加到IIS调试,未命中断点

    写好了一个WebService,部署到IIS上,用浏览器访问发现并不能命中断点. 经过多次的查找发现是由于附加的代码类型选择错误. 下图由于错误的选择了托管代码,导致调试时不命中断点,勾选自动解决.

  7. Luogu P2970 [USACO09DEC]自私的放牧

    https://www.luogu.org/problemnew/show/P2970 P2970 [USACO09DEC]自私的放牧 题目描述 Each of Farmer John's N (1 ...

  8. JS布尔值(Boolean)转换规则

    原文作者: louis 原文链接: http://louiszhai.github.io/2015/12/11/js.boolean/ 语法 众所周知, JavaScript有五个基本的值类型:num ...

  9. PAT 1057. Stack

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  10. 【Codeforces 478C】Table Decorations

    [链接] 我是链接,点我呀:) [题意] 给你r,g,b三种颜色的气球 每张桌子要放3个气球 但是3个气球的颜色不能全都一样 (允许两个一样,或者全都不一样) 问你最多能装饰多少张桌子 [题解] 先把 ...