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. SparkStreaming架构

    SparkStreaming是一个对实时数据流进行高通量.容错处理的流式处理系统,可以对多种数据源(如Kdfka.Flume.Twitter.Zero和TCP 套接字)进行类似Map.Reduce和J ...

  2. 教育行业CRM项目开发

    项目开发流程 需求分析 存储所有的客户咨询信息    避免重复数据    客户多次跟踪记录    客户来源分析.成单率分析    每个销售只能修改自己的客户信息    报名流程开发        班级 ...

  3. java23种设计模式——四、原型模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

  4. FinalShell远程连接工具推荐

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

  5. Qt 子窗口监听主窗口信号

    Qt 子窗口监听主窗口信号(转载)  原文链接:https://www.cnblogs.com/ybqjymy/p/12169762.html 1 MainWindow *ptr = NULL; 2 ...

  6. PJSIP 机器人

    摘要: 最近再研究PJSIP,有一个需求,再适当的时候,需要给远程客户端放音,比如:播放一段广告.或者一段音乐.需要采用API来实现. 正文: 最近想用PJSIP做一个机器人,想法比较简单就是获取客户 ...

  7. Android开发之SDCardUtils工具类。java工具详细代码,附源代码。判断SD卡是否挂载等功能

    package com.xiaobing.zhbj.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputSt ...

  8. USB Key

    随着互联网和电子商务的发展,USB Key作为网络用户身份识别和数据保护的“电子钥匙”,正在被越来越多的用户所认识和使用.本文对USB Key的产生和未来的发展趋势作了一个简单的介绍. 目前市场上见到 ...

  9. 【转】对初学LoadRunner朋友的建议

    对初学LoadRunner朋友的建议 作者:wind摘要:随着Internet的普及与迅速发展,企业业务量的迅速加大,数据大集中成为一种趋势,IT系统承载的负荷越来越重,系统性能的好坏严重的影响了企业 ...

  10. istio部署

    Istio的部署介绍 目录 Istio的部署介绍 部署模型 集群模式 单集群 多集群 网络模型 单网络 多网络 控制面模型 身份和信任模型 网格中的信任 网格之间的信任 网格模型 单网格 多网格 租户 ...