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

其实这个算法是在补同余最短路的时候用到的,当时突然发现理解算法导论上的原理甚至有效性证明,但是就是没办法写出来合适的代码。。于是到处寻找可以用来试验最短路径算法的试验场(当时学矩阵快速米的时候也是找了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. 前端-页面性能调试:Hiper

    前端-页面性能调试:Hiper   我们写单页面应用,想看页面修改后性能变更其实挺繁琐的.有时想知道是「正优化」还是「负优化」只能靠手动刷新查看network.而Hiper很好解决了这一痛点(其实Hi ...

  2. php允许被跨域ajax请求

    只要在被请求端,加一句: header('Access-Control-Allow-Origin: *');

  3. Oracle Hyperion Planning 11.1 .1:创建与管理应用程序 第1课:Planning概述

    第1课:Planning概述 1.说明 Oracle Enterprise Performance Management system Oracle Enterprise Performance Ma ...

  4. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...

  5. System Center Configuration Manager 2016 域准备篇(Part1)

    本系列指南如何从Microsoft安装最新的Configuration Manager基准版本.较新的可用基准版本System Center Configuration Manager(当前分支)版本 ...

  6. selenium显示等待解决浏览器未加载完成查找控件的问题

    问题描述:wap版支付成功后,跳转到支付成功页,查找的元素已出现,如图的:元素1,元素2,但是提示查找的元素超时,失败,并且每到这个页面都会报页面超时,不能查找到页面元素 原始代码: try{ op. ...

  7. Codeforces Round #327 (Div. 2) B Rebranding(映射)

    O(1)变换映射,最后一次性替换. #include<bits/stdc++.h> using namespace std; typedef long long ll; ; char s[ ...

  8. 1.VS Code 开发C#入门 安装Dotnet core

    1. dot.net  网站 下载 .NET Core 1.0  (https://www.microsoft.com/net/download/core) 2. 打开命名提示符: 3.dotnet ...

  9. 【转】 Solr的SolrCloud与Master-slave主从模式对比

    第一印象 SolrCloud是Solr4.0引入的,主要应对与商业场景.它很像master-slave,却能自动化的完成以前需要手动完成的操作.利用ZooKeeper这个工具去监控整个Solr集群,以 ...

  10. eclipse中的字体大小设置和背景色设置

    1.字体大小设置 在basic下选择最后一个TextFont 护眼背景色设置 添加到自定义颜色后点确定 最后一步点apply