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. 致敬学长!J20航模遥控器开源项目计划【开局篇】 | 先做一个开机界面 | MATLAB图像二值化 | Img2Lcd图片取模 | OLED显示图片

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  2. python格式化输出及大量案例

    python格式化输出符号及大量案例 1.格式化输出符号 python格式化输出符号 格式化符号 含义 %c 转化成字符 %r 优先使用repr()函数进行字符串转化 %s 转换成字符串,优先使用st ...

  3. CAOZ:百度搜索引擎的人工干预的看法

    http://www.wocaoseo.com/thread-247-1-1.html 百度确有人工干预的机制,但是这个机制与互联网上的传闻相差很大,人工干预的范围其实是非常小的,特别恶性的搜索结果, ...

  4. Node.js调试相关

    如何进行Nodejs性能分析? nodejs性能最重要的两个部分:CPU耗时查看和内存泄漏排查 一,CPU相关 主要思路是两个:借助第三方的工具,以及借助v8自带的性能分析工具 借助第三方的工具 主要 ...

  5. Android开发之数据存储——SharedPreferences基础知识详解,饿补学会基本知识,开发者必会它的用法。

    一.数据存储选项:Data Storage --Storage Options[重点] 1.Shared Preferences Store private primitive data in key ...

  6. 长沙做假证u

    长沙做假证[电/薇:187ヘ1184ヘ0909同号]办各类证件-办毕业证-办离婚证,办学位证书,办硕士毕业证,办理文凭学历,办资格证,办房产证不. 这是一个简单的取最大值程序,可以用于处理 i32 数 ...

  7. string matching(拓展KMP)

    Problem Description String matching is a common type of problem in computer science. One string matc ...

  8. java初探(1)之防止库存为负以及防超买

    在秒杀业务中,会出现当只剩一个库存时,但有多个人仍然秒杀成功,且都减库存成功,因此,在减库存,更新数据库的时候,需要在sql语句上进行判断,是否库存大于0. @Update("update ...

  9. 使用IDEA写Python之pytest环境搭建及第一个程序编写

    一.准备篇 Python环境:3.8.3 开发工具:IDEA,对你没有看错 二.IDEA下安装开发环境 1. python的下载 https://www.python.org/downloads/ P ...

  10. Java8 ParallelStream

    ParallelStream 并行流就是一个把内容拆分成多个数据块,用不同线程分别处理每个数据块的流.对收集源调用parallelStream方法就能将集合转换为并行流. 并行流 并行流和顺序流转换 ...