这题开始用没有优化的迪杰斯特拉喜闻乐见的超时了,然后我用bellmanford算法按理说时间复杂度更大但是书上说往往只要很短的时间就可以求出最短路。

所以我用了这个算法但是我对这个算法还是不熟套了模板。这题数据应该出水了,不然这个算法时间复杂度挺高的,应该过不了。应该是迪杰斯特拉的优化,一会写个迪杰斯特拉的优化后的算法看看应该可以过。

Dijkstra:适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV)

BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度O(VE)
SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处的复杂度证明是有问题的,其实SPFA的最坏情况应该是O(VE).
Floyd:每对节点之间的最短路径。
/*
ID: jinbo wu
TASK:butter
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
int n,p,c;
vector<pair<int,int> >g[805];
int a[805];
bool vis[805];
int d[805];
int Bellman_Ford(int m)
{queue<int> q;for(int i=0;i<=p;i++) d[i]=(i==m? 0 : 10000);q.push(m);while(!q.empty()){int x=q.front(); q.pop();vis[x]=0;for(int i=0;i<g[x].size();i++){int v=g[x][i].first;if(d[v]>d[x]+g[x][i].second){d[v]=d[x]+g[x][i].second;if(!vis[v]){vis[v]=1;q.push(v);}}}}int ans=0;for(int i=1;i<=n;i++)ans+=d[a[i]];return ans;
}
int main()
{freopen("butter.in","r",stdin);freopen("butter.out","w",stdout);int u,v,w;cin>>n>>p>>c;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=c;i++){cin>>u>>v>>w;g[u].push_back(make_pair(v,w));g[v].push_back(make_pair(u,w));}int ans=1000000;for(int i=1;i<=p;i++){int temp=Bellman_Ford(i);ans=min(ans,temp);}cout<<ans<<endl;}

这是该程序的运行时间

下面是用迪杰斯特拉算法经过优选队列优化过后的代码

/*
ID: jinbo wu
TASK:butter
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int> > g[805];
int n,p,c;
bool done[805];
int d[805];
int a[805];
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > q;
int dij(int m)
{memset(done,0,sizeof(done));for(int i=1;i<=p;i++) d[i]=(i==m ? 0 :10000);q.push(make_pair(d[m],m));while(!q.empty()){pair<int,int>  u=q.top();q.pop();int x=u.second;if(done[x]) continue;done[x]=1;for(int i=0;i<g[x].size();i++){int v=g[x][i].first;if(d[v]>d[x]+g[x][i].second){d[v]=d[x]+g[x][i].second;q.push(make_pair(d[v],v));}}}int ans=0;for(int i=1;i<=n;i++)ans+=d[a[i]];return ans;}
int main()
{freopen("butter.in","r",stdin);freopen("butter.out","w",stdout);int u,v,w;cin>>n>>p>>c;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=c;i++){cin>>u>>v>>w;g[u].push_back(make_pair(v,w));g[v].push_back(make_pair(u,w));}int ans=10000000;for(int i=1;i<=p;i++){int temp=dij(i);ans=min(ans,temp);}cout<<ans<<endl;
}

经过优化过后的迪杰斯特拉为什么没有bellman_ford快?,普通迪杰斯特拉算法到test7的时候就0.5s多test8就超时了。

usaco Sweet Butter(迪杰斯特拉(优先队列优化),bellman_ford算法模板)相关推荐

  1. prim、迪杰斯特拉与卡鲁斯卡尔算法模板

    prim算法和迪杰斯特拉算法的区别主要是更新dist的方式不同,迪杰斯特拉算法更新距离时比较的是起始点到目标集合的最短距离,而prim算法更新的是未标记集合到已标记集合某点的最短距离. 迪杰斯特拉算法 ...

  2. 18362 寻找Megumi 迪杰斯特拉+优先队列优化

    传送门: OJ 新生赛 2018华山论剑. 题目大意:从点1出发,按次序经过K个点,再走到点n.求最短路径. 解题思路:弗洛伊德算法可能超时,所以用单源最短路径算法,依次求出从1到a1,a1到a2.. ...

  3. 【迪杰斯特拉的优化】 洛谷4779板子题

    P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 最终,他 ...

  4. 【讲解 + 模板】Dijkstra迪杰斯特拉+堆优化

    Dijkstra迪杰斯特拉+堆优化 众所周知,朴素的迪杰斯特拉的时间复杂度为O(n^2),这在某些题目当中是会超时的.但如果在迪杰斯特拉中枚举每个最短边时加入堆优化,则迪杰斯特拉的效率则会大大提高. ...

  5. 7-38 社交网络图中结点的“重要性”计算 (30分) 最短路 迪杰斯特拉堆优化

    在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱.而结点根据其所处的位置不同,其 ...

  6. 算法之「迪杰斯特拉(Dijkstra)算法」

    最短路径 生活中,我们常常会面临着对路径的最优选择问题,可能是路程最短,也可能是时间最短,这个的最短路径就类似路程最短的选择. 比如在上海,乘地铁去某个地方,上海的地铁路线很多,从地图上看上去就是一个 ...

  7. 普利姆(prim)算法与迪杰斯特拉(dijestella)算法

    一:普利姆(prim)算法 对于临界矩阵表示的图,时间复杂度为O(|V|2) 对于邻接表表示的图,时间复杂度为O(|V|+|E|) 代码: int dist[];//用来记录从原点到各个节点的距离 b ...

  8. 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题

    1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...

  9. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子

    目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...

  10. 六、最短路径——迪杰斯特拉(Dijkstra)算法

    在网图和非网图中,最短路径的含义是不同的.由于非网图它没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并 ...

最新文章

  1. 【跃迁之路】【738天】程序员高效学习方法论探索系列(实验阶段495-2019.2.28)...
  2. RabbitMQ高可用方案总结
  3. VM虚拟机的配置文件(.vmx)损坏修复
  4. mybaits十:关联查询
  5. 【Notes6】ajaxjson,校验用户名,自动提示,CORS,/swagger开发rest,Websocket,DNS
  6. leetcode67. 二进制求和
  7. NGINX Plus集成fail2ban进行动态IP黑名单配置
  8. c#web页面显示弹窗_web页面实现PDF读取显示
  9. php js后端渲染,webpack后端渲染详解
  10. 如何在 Mac 上使用“旁白实用工具”自定“旁白”?
  11. QTreeView样式
  12. 考勤记录查询java_kaoqin 一个员工考勤软件,用java和sql写的,实现基本的签到和查询功能 Develop 238万源代码下载- www.pudn.com...
  13. iOS:仿微信朋友圈的实现
  14. 操作系统、体系结构和传奇船长的泰坦级超级旗舰
  15. Linux修仙之路——RAID技术
  16. 大数据入门:Scala大数据黄金语言
  17. 谈谈对摩尔定理的理解及其当前是否继续有效
  18. php zip解压原理,PHP ZipArchive实现解压缩zip文件
  19. fluent怎么用c语言编程,[转载]FLUENT UDF 使用指导
  20. 工业防火墙架构与技术【第二节:硬件架构③】

热门文章

  1. 2022-2028年中国新零售行业深度调研及投资前景预测报告(全卷)
  2. 2022-2028年中国塑料绳的制造行业市场现状调查及投资商机预测报告
  3. 2022-2028年中国模胚行业市场研究及前瞻分析报告
  4. Pandas 使用入门
  5. 【Sql Server】DateBase-结构化查询特殊对象“游标”
  6. tensor和模型 保存与加载 PyTorch
  7. Python中re的match、search、findall、finditer区别正则
  8. redis 双写一致性
  9. 2021年大数据Kafka(六):❤️安装Kafka-Eagle❤️
  10. 2021年大数据Kafka(二):❤️Kafka特点总结和架构❤️