一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结

最朴素算法:

邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+MLE,

算优点??:但好写好想,比下面的代码短了差不多一半。

#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; int main()
{
int a[][],point,i,j,k,number,t1,t2,t3,u,n,min,book[]={},dis[];
int inf=;
scanf("%d %d\n",&point,&number);
int x;
cin>>x;
for(int i=;i<=point;i++)
for(int j=;j<=point;j++)
if(i==j)a[i][j]=;
else
a[i][j]=inf; for(int i=;i<=number;i++)
{
cin>>t1>>t2>>t3;
a[t1][t2]=t3;
} for(int i=;i<=point;i++)
dis[i]=a[][i]; for(int i=;i<=point-;i++)
{
min=inf;
for(int j=;j<=point;j++)
if(book[j]==&& dis[j]<min)
{
min=dis[j];
u=j;
}
book[u]=;
for(int k=;k<=point;k++)
{
if(a[u][k]<inf)
if(dis[k]>dis[u]+a[u][k])
dis[k]=dis[u]+a[u][k];
}
}
for(int i=;i<=point;i++)
cout<<i<<" "<<dis[i]<<endl;
return ;
}

第一次优化是前向星存边,

比上面最朴素的大量省空间,也省了部分时间,luogu上共用时1400ms+,一个点max接近五百。

 #include<iostream>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
# include <cstdio>
#define maxi 2147483647; using namespace std; struct node
{
int z;//子节点
int val;//权值
int nexty;//最近父节点相同边编号
}edge[];
int head[];//某点为父节点运出的最后一条边
int cnt=,curr;// 边id inline void add(int a,int b,int c)//建立边向前星
{
cnt++;
edge[cnt].z=b;
edge[cnt].val =c;
edge[cnt].nexty =head[a];
head[a]=cnt;
} int main()
{
bool visit[]={};//是否已经加入最短路
long long dis[];//最短路存值
int n,m,s;
int a,b,c; scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=n;i++)//初始化边权值为无穷
dis[i]=maxi;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
//读入
curr=s;
dis[s]=;//到最初点距离为零
long long minn; while(!visit[curr])
{
visit[curr]=true;
for(int i=head[curr];i!=;i=edge[i].nexty )
{
if(!visit[edge[i].z]&&dis[edge[i].z]>dis[curr]+edge[i].val )
dis[edge[i].z]=dis[curr]+edge[i].val;
}
minn=;
for (int i=;i<=n;i++)
if(!visit[i]&&minn>dis[i])
{
minn=dis[i];
curr=i;
}
}
for (int i=;i<=n;i++)
printf("%lld ",dis[i]);
return ;
}

dijkstra优化1

最后的优化使代码长达近百行

主要运用:快读快写,优先队列(堆),前向星存边

不过这次优化使用结构体存边的时候发生了玄学错误,现在还是找不出错,不过用几个数组存边就AC了???

个人是喜欢结构体的,毕竟好写也整齐,但是没通过的话就不发出来了

这个复杂度又比上一个程序降低了不少,luogu 共用时500+ms,单个点max160+ms,比上一个快了大概3,4倍

下面这个是ac的数组存边。

 #include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
#include <stdio.h>
#include <string.h>
#define maxn 10005
#define maxm 500005
#define inf 2147483647 using namespace std; int n,m,cnt=;
bool visit[maxn];
int head[maxm],next[maxm],v[maxm],w[maxm],dist[maxn]; inline int read()
{
char ch;
int a=;
while(!(((ch=getchar())>='')&&(ch<='')));
a*=;a+=ch-'';
while(((ch=getchar())>='')&&(ch<=''))a*=,a+=ch-'';
return a;
} void write(int x)
{
if(x<) putchar('-'),x=-x;
if(x>)write(x/);
putchar(x%+'');
return ;
} struct cmp
{
bool operator()(int x,int y)
{
return dist[x]>dist[y];
}
}; void add(int a,int b,int c)
{
v[cnt]=b;
w[cnt]=c;
next[cnt]=head[a];
head[a]=cnt++;
return ;
} void dijk(int s)
{
priority_queue<int,vector<int>,cmp> q2;
while(!q2.empty() )
q2.pop() ;
dist[s]=;
q2.push(s);
while(!q2.empty() )
{
int x=q2.top() ;
q2.pop() ;
if(!visit[x])
{
visit[x]=true;
for(int i=head[x];i!=-;i=next[i])
{
int y=v[i];
dist[y]=min(dist[y],dist[x]+w[i]);
q2.push(y);
}
}
}
return ;
} int main()
{
int s;
n=read();
m=read();
s=read();
memset(head,-,sizeof(head));
memset(visit,,sizeof(visit));
for(int i=;i<=m;i++)
{
int a,b,c;
a=read(),b=read(),c=read();
add(a,b,c);
}
for(int i=;i<=n;i++)
dist[i]=inf;
dijk(s);
for(int i=;i<=n;i++)
write(dist[i]),putchar(' ');
return ;
}

dijkstra优化2

注意!这不是最优化dijkstra,只是个人能力能达到的最优化了。。。

写那么长的代码还是挺有成就感的

单源最短路dijkstra算法&&优化史的更多相关文章

  1. 单源最短路——dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...

  2. 单源最短路Dijkstra算法——matlab实现

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...

  3. 单源最短路(Dijkstra算法)

    #返回上一级 @Author: 张海拔 @Update: 2015-03-11 @Link: http://www.cnblogs.com/zhanghaiba/p/3514570.html Dijk ...

  4. 单源最短路-dijkstra算法(未优化)

    bool used[maxn]; int g[maxn][maxn]; // 边未联系的填充为INF int d[maxn]; void dijkstra(int s){ memset(g,false ...

  5. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  6. 【算法】单源最短路——Dijkstra

    对于固定起点的最短路算法,我们称之为单源最短路算法.单源最短路算法很多,最常见的就是dijkstra算法. dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么 ...

  7. 单源最短路——Bellman-Ford算法

    1.Dijkstra的局限性 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的. 列如以 ...

  8. 利用分支限界法求解单源最短路(Dijkstra)问题

    分支限界法定义:采用Best fist search算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按Best first的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分 ...

  9. 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 C.星球游戏 (单源最短路,Dijkstra)

    题意:有\(n\)个点,\(m\)条双向边,两个方向的权值都是相等的,可以从\(A\)中的某个点出发走到\(B\)中的某个点,求所有路径中的最短距离,如果A和B中没有点联通,则输出\(-1\). 题解 ...

随机推荐

  1. npm属性笔记

    scripts属性,运行脚本命令的npm命令行缩写,常见如下npm run devnpm run startnpm run build dependencies属性,项目运行时配置模块依赖的模块列表, ...

  2. 移动端h5开发相关内容总结css篇--笔记

    原文参考http://mp.weixin.qq.com/s/Nho2DHj-Y59j2F62vpN9jQ 1.开发移动端,头部必要的配置<meta name="viewport&quo ...

  3. C/C++ OpenCV读取视频与调用摄像头

    原文:http://blog.csdn.net/qq78442761/article/details/54173104 OpenCV通过VideoCapture类,来对视频进行读取,调用摄像头 读取视 ...

  4. 关于ios 10 的新的部分

    编译器Xcode 8.2.1  SDK 10.2 1.   关于麦克风,相机,相册等部分的权限,需要在info.plist内进行设置,否则会出现crash.

  5. Linux命令 标签: linux 2016-08-01 10:26 508人阅读 评论(0) 收藏

    Linux常用命令 文件.目录的基本操作 ls - 查看文件 cp - 拷贝文件 mv - 移动或重命名文件 rm - 删除文件 touch - 创建空文件或更新文件时间 cd - 改变当前路径 pw ...

  6. Idea中Git的使用和两种类型的冲突解决

    一.Git冲突解决 在idea开发工具中使用Git时,主要用到的快捷按钮如下五个:   这五个按钮的使用说明及在idea中如何配置和使用git可参考https://github.com/DayThin ...

  7. Django objects.values

    values(*fields) 返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象. 每个字典表示一个对象,键对应于模型对象的属性名称. 下面的 ...

  8. JQuery获取和设置Select选项的常用方法总结

    1.获取select 选中的 text:  $("#cusChildTypeId").find("option:selected").text();  $(&q ...

  9. UVa 1262 - Password(解码)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. vue中调用地图

    一. vue-amap,一个基于 Vue 2.x 和高德地图的地图组件 这个就不细说了,按照其文档,就能够安装下来. 二. 按照官方提供的方法引入 1.修改webpac.base.conf.js文件 ...