好多基础知识都没补完,只好看到、用到一个赶紧补全一个,并且保证下次需要的时候直接用,不用回来再补;

其实这个算法是在补同余最短路的时候用到的,当时突然发现理解算法导论上的原理甚至有效性证明,但是就是没办法写出来合适的代码。。于是到处寻找可以用来试验最短路径算法的试验场(当时学矩阵快速米的时候也是找了51nod上面的一到基础题作为测试的)来熟悉和不全最短路相关基础知识。

首先是DIJKSTRA

对于DIJKSTRA首先是个贪心算法,每次从集合中选择一条没有走过的最短路径来作为新的边,到达新的节点。在以当前找到的这条边更新所有可达的边——所谓的松弛操作。

可以证明,在n次这样的松弛操作之后,可以求得单元最短路(具体证明见算法导论)

这题的要求比单元最短路相对更高些,他要求找到最短路且权重最高的路径。因而应当在每次进行松弛操作时进行更新——当且仅当路径长度相同时选择更大的权重,其他时候选择更短的边的权重。

DIJKSTRA如下:

 #include<bits/stdc++.h>
using namespace std; const long long INF=1e12+;
const long long MAXN=1e3+;
long long dp[MAXN];
long long point[MAXN];
long long mon[MAXN];
long long path[MAXN][MAXN];
long long n,m,start,end; void init()
{
cin>>n>>m>>start>>end;
memset(mon,,sizeof(mon));
for(int i=;i<MAXN;++i)
for(int j=;j<MAXN;++j)path[i][j]=INF;
for(int i=;i<n;++i)
{
cin>>point[i];
dp[i]=INF;
}
for(int i=;i<m;++i)
{
int a,b,p;
cin>>a>>b>>p;
path[a][b]=p;
path[b][a]=p;
}
}
int v[MAXN];
void dijkstra()
{
memset(v,,sizeof(v));
int x=start;
mon[start]=point[start];
dp[start]=; //dijkstra初始化,应当以最起始点为0点
for(int i=;i<n;++i)
{
long long mini=INF;
for(int j=;j<n;++j)
{
if(!v[j]&&dp[j]<mini)
{
x=j;
mini=dp[j];
}
}v[x]=; //标记出现过的点
for(int j=;j<n;++j)
{
if(!v[j]&&dp[j]>dp[x]+path[x][j])
{ mon[j]=mon[x]+point[j];
}if(!v[j]&&dp[j]==dp[x]+path[x][j])//注意更新时确保该点没有被走到,否则可能出现重复更新
{
mon[j]=max(mon[j],mon[x]+point[j]);
} dp[j]=min(dp[x]+path[x][j],dp[j]);
}
}cout<<dp[end]<<" "<<mon[end]<<endl;
}
int main()
{
cin.sync_with_stdio(false);
init();
dijkstra();
return ;
}

堆优化的dijkstra,来自刘汝佳的蓝书,同样要注意简要修改下。

 #include<bits/stdc++.h>
using namespace std; const long long MAXN=+;
const long long INF=1e7+; class Edge
{
public:
long long from,to,dist;
}; class HeapNode
{
public:
long long d,u;
bool operator < (const HeapNode& h1)const
{
return this->d>h1.d;
}
}; long long mon[MAXN];
long long point[MAXN];
long long n1,m1,start,end; struct Dijkstra
{
long long n,m;
vector<Edge> edges;
vector<long long> G[MAXN];
bool done[MAXN];
long long d[MAXN];
long long p[MAXN]; void init(long long n)
{
this->n=n;
for(long long i=;i<n;++i)
{
G[i].clear();
}edges.clear();
} void AddEdge(long long from,long long to,long long dist)
{
edges.push_back((Edge){from,to,dist});
m=edges.size();
G[from].push_back(m-);
} void dijkstra(long long s)
{
priority_queue<HeapNode> Q;
for(long long i=;i<n;++i)d[i]=INF;
d[s]=;
memset(done,,sizeof(done));
Q.push((HeapNode){,s});
mon[s]=point[s];
while(!Q.empty())
{
HeapNode x=Q.top();Q.pop();
long long u=x.u;
if(done[u])continue;
done[u]=true;
for(long long i=;i<G[u].size();++i)
{
Edge &e=edges[G[u][i]];
if(d[e.to]>d[u]+e.dist)
{
d[e.to]=d[u]+e.dist;
p[e.to]=G[u][i];
Q.push((HeapNode){d[e.to],e.to});
mon[e.to]=mon[u]+point[e.to];
}else if(d[e.to]==d[u]+e.dist)
mon[e.to]=max(mon[u]+point[e.to],mon[e.to]);
}
}
}
}; int main()
{
cin.sync_with_stdio(false);
Dijkstra d1;
cin>>n1>>m1>>start>>end;
for(long long i=;i<n1;++i)cin>>point[i];
d1.init(n1);
for(long long i=;i<m1;++i)
{
long long a,b,p;cin>>a>>b>>p;
d1.AddEdge(a,b,p);
d1.AddEdge(b,a,p);
}
d1.dijkstra(start); cout<<d1.d[end]<<" "<<mon[end]<<endl; return ;
}

Bellman_Ford算法:
首先,算法思路:设定某有向图中,不存在负环,则对于每条最短路,都会在每一轮松弛中,得到至少一条最短路。

若有向图G中,有一条最短路:A->B->C->D->E,那么因为起始节点为A,则A->B的最短路径会在第一轮松弛操作时被找到。而后操作也是同理。接下来的每个最短路元素都会在未来的某一次松弛操作中被找到。因为每轮松弛操作都至少找到一个元素,所以我们应当认为

51nod_1459 最短路 dijkstra 特调参数的更多相关文章

  1. 华夏60 战斗机(最短路dijkstra)

    华夏60 战斗机(最短路dijkstra) 华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...

  2. hdu 2544 最短路 Dijkstra

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

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

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

  4. GBDT、XGBOOST、LightGBM调参数

    总的认识: LightGBM  > XGBOOST  > GBDT 都是调参数比较麻烦. GBDT分类的最佳调参数的讲解: Gradient Boosting Machine(GBM)调参 ...

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

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

  6. HUD.2544 最短路 (Dijkstra)

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

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

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

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

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

  9. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

随机推荐

  1. 《web-Mail服务的搭建》

    首先是搭建后台服务: 下载下面2个软件包 extmail-1.2.tar.gz extman-1.1.tar.gz 创建一个extsuite目录,固定格式 mkdir /var/www/extsuit ...

  2. ORA-02298: 无法验证 (约束) - 未找到父项关键字 解决办法

    --在用PL/SQL导入表数据的时候报错 ORA-02298: 无法验证 (PNET.POST_CLOB_FK) - 未找到父项关键字 --发现是启用外键约束时报的错alter table DM_VO ...

  3. asp.net MVC 4.0 Model元数据回顾——HtmlHelper的ModelMetadata

    模板方法包括Display/DisplayFor.Editor/EditorFor.DisplayForModel/EditForModel提供辅助生成Html的模型元数据信息 public stat ...

  4. C/S框架设计经验小结

    C/S架构程序应用广泛,比如常见的QQ.微信.Outlook,还有手机上的各种APP都是C/S架构的.C指的是Client,即客户端,S指的是Server,即服务端. 经常听到初学者争论,是学C/S结 ...

  5. 渐进式jpeg(progressive jpeg)图片及其相关

    最近看有些网站上的jpg格式的图片在呈现的时候,有两种方式,一种是自上而下扫描式的,还有一种就是先是全部的模糊图片,然后逐渐清晰(就像GIF格式的交错显示). 一.基本JPEG(baseline jp ...

  6. win10+asp+access 父路径开启无效

    如题: 在win10环境下,布署asp+access,发现在用到"../website/"时就出错,提示不能使用父路径 可是我在IIS 的asp中明明打开了父路径的 如下 但是偏偏 ...

  7. vue-resource的使用

    之前使用axios post请求不能向后台发送数据,然后使用了vue-resource这个插件 import  Vue from 'vue' import VueResource from 'vue- ...

  8. mui蒙版使用例子

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...

  9. java Vamei快速教程03 构造器和方法重载

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initial ...

  10. linux 命令——40 wc (转)

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...