图论最短路及生成树(Prim,Djikstra,Spfa,Bellan-ford,kruskal,topsort)

简介: 图论最短路及生成树(Prim,Djikstra,Spfa,Bellan-ford,kruskal,topsort)
    for (int i = h[t]; i != -1; i = ne[i]) {
        int j = e[i];
        if (dist[j] > dist[t] + w[i]) {
            dist[j] = dist[t] + w[i];
            cnt[j] = cnt[t] + 1;
            if (cnt[j] >= n) return true;
            if (!st[j]) {
                st[j] = true;
                q.push(j);
            }
        }
    }
}
return false;

}

六、Prim算法求最小生成树
无向图;图中可能存在重边和自环;边权可能为负数。

算法思想:更新到集合的最短距离dist

int state[N],pre[N],st[N],dist[N];
int res;

void prim(){

memset(dist,0x3f,sizeof dist);
dist[1] = 0;

for(int i=1;i<=n;i++){
    int t=-1;
    
    for(int j=1;j<=n;j++){
        if(!st[j] && (t==-1||dist[t]>dist[j])){
            t = j;
        }
    }
    
    st[t] = 1;
    res += dist[t];
    
    for(int j=1;j<=n;j++){
        if(!st[j] && dist[j]>g[j][t]){
            dist[j] = g[j][t];
        }
    }
}

}

七、Kruskal算法求最小生成树
算法思想:借助并查集优化算法

include <bits/stdc++.h>

using namespace std;

const int N = 100100;
const int M = 2*N; // 边的数量

struct edge{

int a;
int b;
int w;

bool operator <(const edge &x) const
{
    return w<x.w;
}

}egs[M];

int n,m;
int pre[N];

int find(int x){

if(pre[x]==x)   return x;
else    return pre[x] = find(pre[x]);

}

int kreskal(){

int res = 0,cnt = 0;

for(int i=0;i<m;i++){
    int a = egs[i].a, b = egs[i].b, w = egs[i].w;
    
    if(find(a)!=find(b)){
        pre[find(a)] = pre[find(b)];
        cnt ++;
        res += w;
    }
}

if(cnt==n-1)    return res;
else    return 0x3f3f3f3f;

}

int main()
{

scanf(<span data-raw-text="" "="" data-textnode-index-1653737321746="723" data-index-1653737321746="5432" class="character">"%d%d<span data-raw-text="" "="" data-textnode-index-1653737321746="723" data-index-1653737321746="5437" class="character">",&n,&m);
int a,b,c;
for(int i=1;i<=n;i++)   pre[i] = i;

for(int i=0;i<m;i++){
    scanf(<span data-raw-text="" "="" data-textnode-index-1653737321746="746" data-index-1653737321746="5542" class="character">"%d%d%d<span data-raw-text="" "="" data-textnode-index-1653737321746="746" data-index-1653737321746="5549" class="character">",&a,&b,&c);
    
    egs[i] = {a,b,c};
}

sort(egs,egs+m);
int t = kreskal();

if(t==0x3f3f3f3f)   cout << <span data-raw-text="" "="" data-textnode-index-1653737321746="764" data-index-1653737321746="5681" class="character">"impossible<span data-raw-text="" "="" data-textnode-index-1653737321746="764" data-index-1653737321746="5692" class="character">" << endl;
else    cout << t << endl;

return 0;

}

八、一点问题:
1、prim 和 dijkstra 的区别与联系:
(1)prim 为更新到集合的最短距离dist; 而dijkastra 为更新到源点的最短距离dist。即更新方式不同

(2)两者均可以使用优先队列优化.不过在优化时,prim最好采用kruskal优化.

2、spfa 和 dijkstra 的区别与联系:
(1)st数组的作用不同,可以将一个点反复设为0和1

(2)SPFA算法中使用的是队列,目的只是记录一下当前发生过更新的点;而dijkstra算法使用的是优先队列,目的是取出不在集合中的距离源点最近的点

3、求负环的常用方法:
求负环的常用方法,基于SPFA,一般都用方法 2:
方法 1:统计每个点入队的次数,如果某个点入队n次,则说明存在负环
方法 2:统计当前每个点的最短路中所包含的边数,如果某点的最短路所包含的边数大于等于n,则也说明存在负环

相关文章
|
机器学习/深度学习 数据采集 人工智能
探索AI技术在文本生成中的应用与挑战
【9月更文挑战第26天】本文深入探讨了AI技术在文本生成领域的应用,并分析了其面临的挑战。通过介绍AI文本生成的基本原理、应用场景以及未来发展趋势,帮助读者全面了解该技术的潜力和局限性。同时,文章还提供了代码示例,展示了如何使用Python和相关库实现简单的文本生成模型。
644 9
|
12月前
|
关系型数据库 MySQL Linux
MySQL版本升级(8.0.31->8.0.37)
本次升级将MySQL从8.0.31升级到8.0.37,采用就地升级方式。具体步骤包括:停止MySQL服务、备份数据目录、下载并解压新版本的RPM包,使用`yum update`命令更新已安装的MySQL组件,最后启动MySQL服务并验证版本。整个过程需确保所有相关RPM包一同升级,避免部分包遗漏导致的问题。官方文档提供了详细指导,确保升级顺利进行。
1234 16
|
机器学习/深度学习 算法 测试技术
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
本文是关于如何搭建深度学习环境,特别是使用mmdetection进行CPU安装和训练的详细指南。包括安装Anaconda、创建虚拟环境、安装PyTorch、mmcv-full和mmdetection,以及测试环境和训练目标检测模型的步骤。还提供了数据集准备、检查和网络训练的详细说明。
891 5
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
|
12月前
|
编解码 算法 索引
基于simulink的模拟锁相环和数字锁相环建模与对比仿真
本研究利用Simulink对模拟锁相环(PLL)和数字锁相环(DPLL)进行建模,通过对比两者的收敛曲线及锁定频率值,分析其性能差异。系统采用MATLAB2022a版本,详细介绍了PLL和DPLL的工作原理,涵盖鉴相器、滤波器及振荡器等关键组件的功能与数学描述。
|
JavaScript
文档工具GitBook使用指南
这篇博客提供了GitBook的安装和使用指南,包括如何在本地安装Node.js和GitBook、初始化GitBook项目、生成HTML和电子书格式(PDF、mobi)的文档,以及推荐的相关阅读资源。
595 8
文档工具GitBook使用指南
|
缓存 算法 安全
MAC地址_MAC地址格式_以太网的MAC帧_基础知识
MAC地址是全球每块网卡唯一的介质访问控制地址,由6字节构成,前24位为厂商代码,后24位为序列号。网卡需安装驱动程序才能正常工作,并实现物理层和数据链路层功能及传输模式转换。MAC地址通常固化在EEPROM中,属于数据链路层范畴。以太网MAC帧包括前导码、地址、类型、数据和校验码,接收方根据MAC地址处理帧。网卡可设为混杂模式接收所有帧,便于网络分析,但也可能被黑客利用。
1406 10
|
SQL Go 数据库
如何通过命令行创建数据库?
如何通过命令行创建数据库?
629 14
|
网络安全 网络架构 网络协议
|
Java
手写SpringBoot(四)之bean动态加载
可以看到只有userApplication tomcatWebServer init打印,没有mySpringboot tomcatWebServer init打印,证明spring-boot只加载了用户定义的那个tomcatWebServer
189 0
|
SQL Go 数据库
Django入门到放弃之ORM多表操作
Django入门到放弃之ORM多表操作

热门文章

最新文章