单源最短路(dijkstra算法及堆优化)

弱化版题目链接

n^2 dijkstra模板

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int i,j,n,m,s,dis[];
bool v[];
struct Node{
int to;
int w;
Node *next;
} node[];
Node *head[];
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(i=;i<=n;i++)
{
dis[i]=0x7fffffff;
head[i]=new Node;
head[i]->next=NULL;
}
int x,y,w;
for(i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
Node *p=new Node;
p->next=head[x]->next;
head[x]->next=p;
p->to=y;
p->w=w;
}
for(Node *h=head[s]->next;h;h=h->next)
dis[h->to]=min(dis[h->to],h->w);    //注意可能有重边
v[s]=;
dis[s]=;
for(i=;i<=n;i++)
{
int k=-,minn=0x7fffffff;
for(j=;j<=n;j++)
if(!v[j]&&dis[j]<minn)
{
minn=dis[j];
k=j;
}
if(k==-) break;
v[k]=;
for(Node *h=head[k]->next;h;h=h->next)
if(!v[h->to]&&dis[h->to]>dis[k]+h->w)
dis[h->to]=dis[k]+h->w;
}
for(i=;i<=n;i++)
printf("%d ",dis[i]);
puts("");
return ;
}

毒瘤标准版

题目链接:https://www.luogu.org/problemnew/show/P4779

直到做了这个题才发现我之前写的堆优化dijkstra一直是错的。。

这个堆优化其实很容易理解,将枚举最小值改为从堆中取出最小值,改变dis时入堆即可

用优先队列维护时必须有两个值:点的编号和当前的距离

以距离为标准从小到大排序, 每次取出最小的

以前错的原因:

堆中只维护了点的编号,以dis[x]排序

这样做在取出一个元素操作后,会更新它周围一圈元素的dis值,

若它周围一圈元素中有的在堆中,dis值被改变后,堆的性质会遭到破坏

然而由于弱化版太水了,我在做毒瘤版之前一直认为这是对的

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define il inline
#define re register
#define N 100010
#define M 200010
int n,m,s,dis[N];
struct NODE{
int p;
int cost;
};
struct cmp{
il bool operator()(NODE ZYX,NODE YSH){
return ZYX.cost>YSH.cost;
}
};
priority_queue<NODE,vector<NODE>,cmp> q;
il int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
void write(int x){
if(x>) write(x/);
putchar(x%+'');
}
struct NODE{
int to,w,next;
} e[M];
int Head[N],num;
il void add(int x,int y,int w){
e[++num].to=y;
e[num].w=w;
e[num].next=Head[x];
Head[x]=num;
}
bool used[N];
int main()
{
n=read(); m=read(); s=read();
int x,y,w;
for(re int i=;i<=m;i++){
x=read(); y=read(); w=read();
add(x,y,w);
}
memset(dis,,sizeof(dis));
dis[s]=;
q.push((NODE){s,});
while(!q.empty()){
NODE k=q.top();
q.pop();
int u=k.p;
if(used[u]) continue;
used[u]=;
for(re int i=Head[u];i;i=e[i].next){
int v=e[i].to;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
q.push(NODE{v,dis[v]});
}
}
}
for(re int i=;i<=n;i++)
write(dis[i]),putchar(' ');
return ;
}

单源最短路模板(dijkstra)的更多相关文章

  1. 单源最短路——朴素Dijkstra&堆优化版

    朴素Dijkstra 是一种基于贪心的算法. 稠密图使用二维数组存储点和边,稀疏图使用邻接表存储点和边. 算法步骤: 1.将图上的初始点看作一个集合S,其它点看作另一个集合 2.根据初始点,求出其它点 ...

  2. UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)

    题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...

  3. 单源最短路模板 + hdu - 2544

    Floyd Floyd 本质上类似一种动态规划,dp [ i ] [ j ] = dp [ i ] [ k ] + dp[ k ] [ j ]. /** * Night gathers, and no ...

  4. 单源最短路:Dijkstra算法 及 关于负权的讨论

    描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...

  5. 单源最短路模板_SPFA_Dijkstra(堆优化)_C++

    随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点 void spfa() { int i,x,k; ;i<=n;i++) { d[i]=o ...

  6. 【一个蒟蒻的挣扎】单源最短路(Dijkstra)

    赛前没啥时间好好解释了,还有三天2019CSP,大家加油啊!!! ヾ(◍°∇°◍)ノ゙ 背掉它就好啦!!! 我觉得我这一版打得还行就放上来了 #include<cstdio> #inclu ...

  7. 【单源最短路模板】 poj 2387

    #include <cstdio> #include <iostream> #include <stdlib.h> #include <memory.h> ...

  8. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  9. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

随机推荐

  1. Jmeter录制pc脚本

    1.打开jmeter后可以看到左边窗口有个“测试计划”和“工作台”,右键“测试计划”,添加 Threads(Users) →线程组,再右键 线程组→添加 配置元件→Http请求默认值 Http请求默认 ...

  2. win10电脑的USB接口插上U盘以后不能使用?

    今天刚遇到的问题 解决方法如下: 右击“我的电脑”选“属性”,打开“设备管理器”,双击“通用串行总线控制器”,双击任意一个,打开属性对话框,切换到“电源管理”选项卡,去除“允许计算机关闭这个设备以节约 ...

  3. Android官方架构组件介绍之LiveData(二)

    LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...

  4. Linux 文件锁flock 实现两个进程相互监听存活状态

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依参数operation所指 ...

  5. zabbix--高级篇-监控docker服务(一)

    一,配置zabbix 客户端环境 rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix//x86_64/zabbix-release-.el7.noarc ...

  6. 深入学习webpack(四)

    更多内容可以看此文档.

  7. Integer代码分析

    我们都知道Integer是int的封装类,提供了一些类型转换等工具方法,有一个-128-127的缓存,而且是final的. ----------------------------- 干货: Inte ...

  8. IAR6.1的工程迁移到IAR6.5不能用的解决方法

    1.重命名过时的CMSIS头文件 "... \ CMSIS \ CM3 \ CoreSupport \ core_cm3.h  比如:core_cm3.h.old 2.启用CMSIS:项目- ...

  9. hduoj 2546饭卡

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  10. DIV+CSS如何让图片和文字在同一行!

    在div+css布局中,如果一行(或一个DIV)内容中有图片和文字的话,图片和文字往往会一个在上一个在下,这是一个新手都会遇到问题,我的解决方法有三: 1.添加CSS属性:vertical-align ...