题目链接:https://www.luogu.com.cn/problem/P1339

朴素dijkstra算法的复杂度是O(n^2),用堆优化的dijkstra复杂度是O(nlogn)的。在本题中前向星存边的时间消耗大约是113ms,空间消耗大约是8M,而在矩阵存边中时间消耗大约是125ms,空间消耗大约是30M,可见前向星是非常节省空间的。但点多边少的时候还是用前向星比较好。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
const int maxn=1e6+;
int n,m,t;
int d[maxn],head[maxn],nxt[maxn];
int e=;
struct node{
int v,dis;
node(int dis,int v):dis(dis),v(v){}
node(){}
bool operator < (const node& a)const
{
return dis>a.dis;//priority_queue中按照dis递增
}
};
struct edge{
int v,w;
}p[maxn];
void init()
{
mem(head,-);
mem(nxt,-);
e=;
}
void addedge(int u,int v,int w)//邻接图单向建边
{
p[e].v=v;
p[e].w=w;
nxt[e]=head[u];
head[u]=e++;
}
void dijkstra(int src)
{
f(i,,n)d[i]=inf;
d[src]=;
priority_queue<node> q;
q.push(node(,src));
while(!q.empty())
{
node u=q.top();
q.pop();
if(d[u.v]<u.dis)continue;
int x=u.v;
for(int i=head[x];~i;i=nxt[i])
{
if(d[p[i].v]>d[x]+p[i].w)
{
d[p[i].v]=d[x]+p[i].w;
q.push(node(d[p[i].v],p[i].v));
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
int st,ed;
scanf("%d%d%d%d",&n,&m,&st,&ed);
int u,v,w;
init();
f(i,,m)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
dijkstra(st);
pf("%d",d[ed]);
}

邻接矩阵存边的代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define P pair<int,int>
#define mp(a,b) make_pair((a),(b))
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
const int maxn=1e6+;
#define maxm 3000
int n,m,t;
int edge[maxm][maxm],d[maxm];
void init()
{
f(i,,n)
f(j,,n)edge[i][j]=inf;
}
void dijkstra(int src)
{
f(i,,n)d[i]=inf;
d[src]=;
priority_queue<P,vector<P>,greater<P> >q;//先定义队列中的元素类型,在定义存放存放该元素的容器,最后决定是最大堆还是最小堆
q.push(mp(,src));
while(!q.empty())
{
P now=q.top();
q.pop();
if(d[now.second]<now.first)continue;
int u=now.second;
f(i,,n)
{
if(edge[u][i]!=inf&&d[i]>d[u]+edge[u][i])
{
d[i]=d[u]+edge[u][i];
q.push(mp(d[i],i));
}
}
}
}
int main()
{
//freopen("1339.txt","r",stdin);
//freopen("output.txt","w",stdout);
//std::ios::sync_with_stdio(false);
int st,ed;
cin>>n>>m>>st>>ed;
init();
int u,v,w;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(edge[u][v]>w)edge[u][v]=w,edge[v][u]=w;
}
dijkstra(st);
cout<<d[ed]<<endl;
}

dijkstra模板题 洛谷1339 邻接图建边的更多相关文章

  1. 最短路径Dijkstra算法模板题---洛谷P3371 【模板】单源最短路径(弱化版)

    题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入格式 第一行 ...

  2. 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)

    推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...

  3. HDU-2544 最短路 Dijkstra模板题

    题目链接:https://vjudge.net/problem/HDU-2544 题意: 题目要求找到节点1到节点n之间的一条最短路 分析: Dijkstra模板题 单源最短路径,可以用dijkstr ...

  4. 扩展中国剩余定理学习笔记+模板(洛谷P4777)

    题目链接: 洛谷 题目大意:求同余方程组 $x\equiv b_i(mod\ a_i)$ 的最小正整数解. $1\leq n\leq 10^5,1\leq a_i\leq 10^{12},0\leq ...

  5. 多项式求逆元详解+模板 【洛谷P4238】多项式求逆

    概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...

  6. HDU 2544 最短路 【Dijkstra模板题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路:最短路的模板题 Dijkstra 算法是一种类似于贪心的算法,步骤如下: 1.当到一个点时, ...

  7. 【三分模板】洛谷P3382三分模板

    题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含 ...

  8. FWT模板(洛谷P4717 【模板】快速沃尔什变换)(FWT)

    洛谷题目传送门 只是一个经过了蛇皮压行的模板... 总结?%%%yyb%%% #include<bits/stdc++.h> #define LL long long #define RG ...

  9. 分数规划模板(洛谷P4377 [USACO18OPEN]Talent Show)(分数规划,二分答案,背包)

    分数规划是这样一个东西: 给定若干元素,每个元素有两个属性值\(a_i,b_i\),在满足题目要求的某些限制下选择若干元素并求出\(\frac{\sum a}{\sum b}\)的最大值. 如果没有限 ...

随机推荐

  1. 使用js闭包的好处

    使用闭包有以下几大好处: a:希望一个变量长期驻扎在内存中. b:避免全局变量的污染.

  2. webpack在用dev-server的时候怎么配置多入口文件

    类似下面这样就可以了,entry设置为对象 每个入口设置为属性,属性的值是一个数组,就可以像单入口一样往这个数组添加entry: { Profile: [ 'webpack-dev-server/cl ...

  3. Mybatis分页插件的使用流程

    如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件.该插件支持任何复杂的单表.多表分页. 1.引入PageHelper的jar包 在pom.xml中添加如下依赖: 12345 ...

  4. 添砖加瓦:Linux系统监测

    前言 前段时间因为项目需求,需要实时获取系统当前的运行状态,遂查阅了不少资料,基于/proc目录下的部分文件,实现了系统CPU.内存.网络和磁盘的实时监测. 一.CPU使用情况获取 获取CPU使用情况 ...

  5. Redis从出门到高可用--Redis复制原理与优化

    Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...

  6. 【转载】checkbox实现全选/取消全选

    比较简单.好理解的写法,做个备注.查看请前往原地址:http://blog.csdn.net/graceup/article/details/46650781 <html> <bod ...

  7. Python 异常处理中的 esle

    前言 我们知道,在Python中,我们是用try- -excetp- - 来做异常处理的,但Python 有别于其他语法的是在异常处理中还提供了else的处理场景,是的,你没看错,就是在条件判断if- ...

  8. git指令-版本回退

    git指令-版本回退 回顾: 1. 修改文件 2. 添加到暂存区并提交 回顾对readme共三次修改: 1. 版本1:wrote a readme file Git is a version cont ...

  9. 自然语言处理NLTK之入门

    环境:window10 + python3 一.安装NLTK pip install nltk # 或者 PyCharm --> File --> Settings --> Proj ...

  10. 密码学习(一)——Base64

    简介 Base64是一种非常常用的数据编码方式,标准Base64可以把所有的数据用"A~Z,a~z,0~9,+,/,="共65个字符(‘=’号仅是一个占位符,作为后缀)表示,当然在 ...