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算法比较的更多相关文章

  1. 堆优化的Dijkstra

    SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...

  2. POJ1797 Heavy Transportation (堆优化的Dijkstra变形)

    Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bus ...

  3. 学习笔记·堆优化$\mathscr{dijkstra}$

    嘤嘤嘤今天被迫学了这个算法--其实对于学习图论来说我内心是拒绝的\(\mathscr{qnq}\) 由于发现关于这个\(\mathscr{SPFA}\)的时间复杂度\(O(kE)\)中的\(k \ap ...

  4. JZYZOJ1525 HAOI2012道路 堆优化的dijkstra+pair

    From Tyvj Guest ☆[haoi2012]道路                 描述 Description     C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当 ...

  5. 堆优化的dijkstra算法

    #include<bits/stdc++.h> using namespace std; #define ll long long #define P pair<int,int> ...

  6. 【模板】堆优化的dijkstra

    生命算法,以防忘记 #include<bits/stdc++.h> using namespace std; int head[200005],dis[200005],n,m,s,f,g, ...

  7. POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)

    昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...

  8. 【51nod1443】路径和树(堆优化dijkstra乱搞)

    点此看题面 大致题意:给你一个无向联通图,要求你求出这张图中从u开始的权值和最小的最短路径树的权值之和. 什么是最短路径树? 从\(u\)开始到任意点的最短路径与在原图中相比不变. 题解 既然要求最短 ...

  9. 【Dijkstra堆优化】洛谷P2243电路维修

    题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...

随机推荐

  1. JavaScript学习系列博客_23_JavaScript 构造函数

    构造函数 - 构造函数是专门用来创建对象的函数 创建一个对象时,通过构造函数的方式来创建.这是通过Object()这个构造函数来创建的一个实例obj. var obj=new Object(); - ...

  2. 算法-搜索(3)AVL树

    AVL树高度平衡的二叉搜索树,任一点的平衡印章只能是+1.-1.0,从而尽量降低树的高度. 如果它有n个结点,高度可保持在O(log2n),平均搜索长度也可保持在O(log2n). (1)AVL树的插 ...

  3. FinalShell远程连接工具推荐

    今天给大家推荐一个类似Xshell的工具FinalShell,这个工具也使用了很长时间了, Windows和Mac版本都有,方便连接虚拟机 可以很方便的上传文件,有兴趣可以试试这款软件. 地址:htt ...

  4. 【亲测】手把手教你如何破解pycharm(附安装包和破解文件)

    此教程支持最新的2019.3版本的Pycharm,并兼容之前的版本. 一.准备工作: 1.下载Pycharm 有条件的可以自行去官网下载,这里我提供了我下载的版本,已上传到百度网盘,链接在下方. 2. ...

  5. Android开发之封装log打印日志的工具类,实用logutils详细代码

    public final class LogUtil { /** all Log print on-off */ private final static boolean all = true; /* ...

  6. Mybatis入门篇之基础CRUD

    前言 作为一个资深后端码农天天都要和数据库打交道,最早使用的是 Hiberate,一个封装性极强的持久性框架.自从接触到 Mybatis 就被它的灵活性所折服了,可以自己写 SQL,虽然轻量级,但是麻 ...

  7. Spark RDD中Runtime流程解析

    一.Runtime架构图 (1)从Spark  Runtime的角度讲,包括五大核心对象:Master.Worker.Executor.Driver.CoarseGrainedExecutorBack ...

  8. [BUUOJ记录] [BJDCTF2020]Easy MD5

    各种关于md5的Bypass操作,都是基本操作,考察数组绕过.弱类型比较绕过以及md5($password,true) ByPass 1.利用md5($password,true)实现SQL注入 F1 ...

  9. Broker的主从架构是怎么实现的?

    前言 上一篇文章我们一起聊了聊RocketMQ的NameServer的一些内部工作流程,了解了NameServer的部署和与Broker之间的联系,那么今天我们就来一起聊聊Broker的一些内部原理. ...

  10. leetcode-双指针遍历

    编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出.不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这一问题.你可以假设 ...