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

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

    1连接池 一 我的错误想法 poolMaximumIdleConnections 最大活跃连接数 poolMaximumActiveConnections 最大空闲连接数 我一直以为 空闲是一直存在的 ...

  2. Chapter 18 MySQL NDB Cluster 7.3 and NDB Cluster 7.4渣翻

    Table of Contents 18.1 NDB Cluster Overview      18.2 NDB Cluster Installation      18.3 Configurati ...

  3. Xcode警告忽略

    Xcode中 cmd+B 之后总会出现各种各样的警告,对于一个对代码有洁癖的人,这种情况很难忍,接下来我们用些特殊手段强制消除这些警告  一.忽略源文件中的警告 使用编译器宏来操作 #pragma c ...

  4. Quartz 定时器,同时运用多个定时器

    效果:每天执行两个定时器,两个定时器不相关联.jar版本Quartz 2.2.3 Java工程结构图  jar 包下载: 链接: https://pan.baidu.com/s/1-7dh620k9P ...

  5. 关于com工程依赖的一些总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 一是com组件工程的依赖设置.比如A这个组件工程要使用B组件工程的类,要如何设置呢?具体就是先把在A工程里加上B工程的 ...

  6. zabbix文档3.4

    zabbix 文档 3.4 5.zabbix 快速入门 1 登录和配置用户 用户名 : Admin 密 码 : zabbix 防止暴力袭击 在连续五次失败登录尝试的情况下,Zabbix界面将暂停30秒 ...

  7. python3基础11(正则表达式及re模块)

    #生成re对象 compile# 之后再期调用 match search 返回匹配到的字符串# findall 返回匹配结果的列表#如果要对匹配的结果进行分组,可加(),并可通过\数字 去应用

  8. 【翻译】22款HTML & CSS3 UI工具包免费下载

    下面盘点了22款适用于网页设计的HTML&CSS3 UI工具包,并且全部都是免费的哦!喜欢就赶紧 下载或收藏吧.这些免费工具可以加速你的网页开发进程,让你有更多时间专注于其他更重要的部分.由于 ...

  9. 最好的 6 个 HTML5 的多媒体播放器

      是 HTML5 中新引入的标签,用来在 Web 网页中嵌入视频播放功能,无需 Flash 和其他嵌入式插件的支持,是浏览器内建的功能,不过  旨在一些高级浏览器中支持,例如 Firefox, Sa ...

  10. 动态规划专题(二)——树形DP

    前言 \(DP\)这东西真的是博大精深啊...... 简介 树形\(DP\),顾名思义,就是在树上操作的\(DP\),一般可以用\(f_i\)表示以编号为\(i\)的节点为根的子树中的最优解. 转移的 ...