朴素版和堆优化版dijkstra和朴素版prim算法比较
1.dijkstra
时间复杂度:O(n^2)
n次迭代,每次找到距离集合S最短的点
每次迭代要用找到的点t来更新其他点到S的最短距离。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=510;
int g[N][N];
int dis[N],n,m;//dis[i]表示节点i到初始点的最短距离
bool st[N];
int dijkstra()
{
memset(dis,0x3f,sizeof dis);
dis[1]=0;
//st[S]=1;如果在迭代之前,将起点放入S数组后,24行,一直无法找到距离S的最近节点。
//相反27行直接判断st[t]=true,可以找到第一个节点,并一直进行下去。
for(int i=1;i<=n;i++)//n次迭代,没次找到距离集合S的最短的点
{
int t=-1;
for(int j=1;j<=n;j++)
{
if(!st[j]&&(t==-1||dis[j]<dis[t]))
{
t=j;
}
}
st[t]=1;//这是第一个节点。
//找到节点t是距离集合S的最短距离的点之后
//用t来更新其他点到s的距离
for(int j=i;j<=n;j++)
{
dis[j]=min(dis[j],dis[t]+g[t][j]);
}
}
if(dis[n]==0x3f3f3f3f)return -1;
else
return dis[n];
}
int main()
{
memset(g,0x3f,sizeof g);
/*
初始化成0会比较好,但不初始化也没关系。因为题目中说所有边权都是正的,
所以 dist[i] + g[i][i] 一定大于 dist[i],所以i->i这条边一定不会被用到。
*/
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
g[a][b]=min(g[a][b],c);
}
cout<<dijkstra()<<endl;
return 0;
}
2.堆优化版dijkstra
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int>PII;
#define ff first
#define ss second
const int N=2e5+10;
int dis[N],n,m,idx,h[N],ne[N],e[N],w[N];
bool st[N];
void add(int a,int b,int c)
{
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
int dijkstra()
{
memset(dis,0x3f,sizeof dis);
dis[1]=0;
priority_queue<PII,vector<PII>,greater<PII>>heap;
heap.push({0,1});
while(heap.size())
{
auto t=heap.top();
heap.pop();
int dist=t.ff,indx=t.ss;
if(st[indx])continue;
st[indx]=1;
for(int i=h[indx];~i;i=ne[i])//用找到的距离集合S最近的点来更新其他点到集合S的距离
{
int j=e[i];
if(dis[j]>dis[indx]+w[i])
{
dis[j]=dis[indx]+w[i];
heap.push({dis[j],j});
}
}
}
if(dis[n]==0x3f3f3f3f)return -1;
else
return dis[n];
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
cout<<dijkstra();
}
2.prim
时间复杂度:O(n^2)
同dijkstra算法
#include<iostream>
#include<cstring>
#include<algorithm>
//稠密图
using namespace std;
const int N=510,M=1e5+10;
//Prim算法给出最小生成树的权重和
int g[N][N],dis[N];
//dis[i]表示第i个点到已经纳入最小生成树集合S的最小距离
int n,m,res;
bool st[N];
int prim()
{
memset(dis,0x3f,sizeof dis);
for(int i=0;i<n;i++)
{
int t=-1;//那个点是哪个点?
for(int j=1;j<=n;j++)//在n个点中寻找不到集合S中距离
//S最近的点的标号
{
if(!st[j]&&(t==-1||dis[j]<dis[t]))
t=j;
}
//找到了那个点t
st[t]=1;
//中间关于i==0时的几个判断
//cout<<dis[t]<<endl;
if(i)
{
res+=dis[t];
//cout<<res<<endl;
}
//在n次迭代中的判断,如果该图是一个不连通图,不存在最小生成树
if(i&&dis[t]==0x3f3f3f3f)return 0x3f3f3f;
//用t点来更新其他点到S的距离
for(int j=1;j<=n;j++)
dis[j]=min(dis[j],g[t][j]);
}
return res;
}
int main()
{
cin>>n>>m;
memset(g,0x3f,sizeof g);
while(m--)
{
int a,b,c;cin>>a>>b>>c;
g[a][b]=g[b][a]=min(g[a][b],c);
}
int t=prim();
if(t==0x3f3f3f)
cout<<"impossible"<<endl;
else
cout<<t;
return 0;
}
朴素版和堆优化版dijkstra和朴素版prim算法比较的更多相关文章
- 堆优化的Dijkstra
SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...
- POJ1797 Heavy Transportation (堆优化的Dijkstra变形)
Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bus ...
- 学习笔记·堆优化$\mathscr{dijkstra}$
嘤嘤嘤今天被迫学了这个算法--其实对于学习图论来说我内心是拒绝的\(\mathscr{qnq}\) 由于发现关于这个\(\mathscr{SPFA}\)的时间复杂度\(O(kE)\)中的\(k \ap ...
- JZYZOJ1525 HAOI2012道路 堆优化的dijkstra+pair
From Tyvj Guest ☆[haoi2012]道路 描述 Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当 ...
- 堆优化的dijkstra算法
#include<bits/stdc++.h> using namespace std; #define ll long long #define P pair<int,int> ...
- 【模板】堆优化的dijkstra
生命算法,以防忘记 #include<bits/stdc++.h> using namespace std; int head[200005],dis[200005],n,m,s,f,g, ...
- POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)
昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...
- 【51nod1443】路径和树(堆优化dijkstra乱搞)
点此看题面 大致题意:给你一个无向联通图,要求你求出这张图中从u开始的权值和最小的最短路径树的权值之和. 什么是最短路径树? 从\(u\)开始到任意点的最短路径与在原图中相比不变. 题解 既然要求最短 ...
- 【Dijkstra堆优化】洛谷P2243电路维修
题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...
随机推荐
- DevOps系列(2)-SonarQube之PostgreSQL
上一篇从整体上讲了下DevOps大概涉及到了哪些内容,以及主要工作流程,接下来我们将分步详细介绍各个部分的使用. 概览 首先从 SonarQube 开始说起,SonarQube 是一个可用于检测重复代 ...
- 【独家】React Native 版本升级指南
前言 React Native 作为一款跨端框架,有一个最让人头疼的问题,那就是版本更新.尤其是遇到大版本更新,JavaScript.iOS 和 Android 三端的配置构建文件都有非常大的变动,有 ...
- GPU虚拟机创建时间深度优化
桔妹导读:GPU虚拟机实例创建速度慢是公有云面临的普遍问题,由于通常情况下创建虚拟机属于低频操作而未引起业界的重视,实际生产中还是存在对GPU实例创建时间有苛刻要求的业务场景.本文将介绍滴滴云在解决 ...
- ASP.NET Core 3.1 WebAPI的跨域问题
1.nuget要加上 Microsoft.AspNetCore.Cors 中间件. 2.在Startup类里先定义一个全局变量. private readonly string AllowSpecif ...
- vue刷新数组
困扰我两天的问题被一行代码解决了!!! 最近在做某个功能时用到了v-for,页面内容都是根据父页面传递过来的数组生成的,但是当我改变数组内容时页面不会跟着改变.这个问题足足困扰了我两天时间,最终下面的 ...
- 2020.08.23 瞎扯周记之论短暂假期(QAQ)内要不要睡午觉
蒟蒻的假期都是很短暂的嘛 作为一只合格的蒟蒻 假期自然是很短暂的QAQ 只有短短的26h93360s(手动微笑) 总体来讲 假期只有两件事要干: 1.满足人体自身需求 2.满足作业需求 2.5.摸鱼 ...
- jq cdn地址
百度CDN支持版本2.0.3, 2.0.2, 2.0.1, 2.0.0,1.11.1, 1.10.2, 1.10.1, 1.10.0, 1.9.1, 1.9.0, 1.8.3, 1.8.2, 1.8. ...
- 前端防止xxs注入
思路: 去掉所有跟sql有关的标签: $(function () { $(":input").change(function () { // alert($(this ...
- android Studio(3.1) 常用快捷键
说 明 快捷键 全部保存 Ctrl + S 最大话/最小化编辑器 Ctrl + Shift + F12 搜索内容(包括代码和菜单) 按两次Shift 查找 Ctrl + F 查找下一个 F3 查找上 ...
- laravel5Eloquent模型与数据表的创建
下面是有关管理员模型与表的创建 生成模型时同时生成数据库迁移文件 在生成的迁移文件中添加字段 运行命令行生成数据表 命令进行混合运用 生成工厂文件,数据填充文件 工厂模型代码 数据填充文件代码 数据填 ...