首页 > 其他分享 >知识梳理

知识梳理

时间:2023-10-31 17:44:49浏览次数:20  
标签:ch int 短路 知识 路径 节点 read 梳理

再过两(百)三(百)天就考CSP2024了,重新学一下提高的知识

part.1 图论

最短路

最短路问题,即在一个图中,寻找两个节点之间的最短路径的问题。最短路问题分为单源最短路和多源最短路

单源最短路:

给定一个起点 \(s\),找到 \(s\) 到图中其它所有节点的最短路径长度。通常 \(div\) 表示 \(s\) 到 \(i\) 的最短路径长度,\((x,y,z)\) 表示从 \(x\) 到 \(y\) 有一条有向边,该条边的权值为 \(z\) 。

一般有两种解法:Dijkstra和SPFA(怎么会有人打dijspfa呢)

  • \(Dijkstra\):
    十分稳定且优化后复杂度是高贵的 \(O(mlogn)\),但是不能处理负边权

    • 算法流程:

    初始化\(d[s]=0\)

    找到一个未标记过且\(d[x]\)值最小的节点\(x\),对\(x\)进行标记

    遍历\(x\)的所有出边\((x,y,z)\),若\(d[y]>d[x]+z\),则更新\(d[y]=d[x]+z\)

    重复第\(2、3\)步,直到所有边都被标记过

    • 算法原理:

    当第2步找到一个未标记过且\(d[x]\)值最小的节点\(x\)时,由于在图中所有未标记的节点\(i\)的\(d[i]\)值都大于等于\(d[x]\),若图中没有负权边,即所有边的权值为非负数,则\(d[x]\)的值不可能再被其它节点更新,因此可以用它来更新其它节点的值.当第三步\(d[y]>d[x]+z\)时,说明当前\(s\)到节点\(y\)的路径比\(s\)经过节点\(x\)和\((x,y,z)\)到达节点\(y\)的路径要长,因此要采用后者的长度来作为更短的路径。而不断重复第2、3步,就可以不断更新全局最小值,达到求出最短路径的目的。

    • 优化原理:

    正常会在第\(2\)步寻找全局最小值时浪费大量的时间。因此我们可以利用优先队列实现每次\(O(logn)\)地查找全局最小值

    • 堆优化DIJ的代码:
    #include<bits/stdc++.h>
    #define lC q<<1
    #define rC q<<1|1
    #define int long long
    #define INF 0x66ccff0712
    #define endl "\n"
    #define maxm 0x66ccff
    #define maxn 0x6cf 
    #define mid ((l+r)>>1)
    #define void inline void
    using namespace std;
    inline int read(){
    int s = 0,w = 1;char ch = getchar();
    while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}
    while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}
    return s*w;
    }
    struct SegmntTree{
        int ver,Next,edge;
    }t[maxm]; 
    const int N=3e5;
    int n,m,s,tot=0,v[N],d[N];
    priority_queue< pair<int,int> > q;
    void add(int x,int y,int z){
        t[++tot].ver=y,
        t[tot].edge=z,
        t[tot].Next=head[x],
        head[x]=tot;
    }
    void Splay()
    {
        memset(v,0,sizeof(v));
        for(int i=1;i<=n;i++)
            d[i]=2147483647;
        d[s]=0;
        q.push(make_pair(0,s));
        while(q.size()){
            int x=q.top().second;
            q.pop();
            if(v[x])
                continue;
            v[x]=1;
            for(int i=head[x];i;i=t[i].Next){
                int y=t[i].ver,z=t[i].edge;
                if(d[y]>d[x]+z){
                    d[y]=d[x]+z;
                    q.push(make_pair(-d[y],y));
                }
            }
        }
    }
    signed main(){
        n=read(),m=read(),s=read();
        while(m--){
            int u=read(),v=read(),w=read();
            add(u,v,w);
        }
        Splay();
        for(int i=1;i<=n;i++)
            cout<<d[i]<<" ";
    }
    
  • \(Spfa\):

    • 算法

标签:ch,int,短路,知识,路径,节点,read,梳理
From: https://www.cnblogs.com/LuoTianYi66ccff/p/17800830.html

相关文章

  • 喜讯!东舟“实车测试机器人”发明专利通过国家知识产权局正式授权,创新成果获专利保护
    近日,东舟技术申报的《用于实车人机交互功能测试中的执行机构、PC上位机及测试方法》知识成果获得国家知识产权局授予发明专利!实车测试机器人是东舟技术在技术创新和研发方面取得的重要突破,该专利技术的应用将有效助力主机厂智能座舱实车测试工作效能提升。这项专利的授权不仅......
  • R语言自然语言处理NLP:情感分析上市公司文本信息知识发现可视化|附代码数据
    全文链接:http://tecdat.cn/?p=31702原文出处:拓端数据部落公众号情感分析,就是根据一段文本,分析其表达情感的技术。比较简单的情感分析,能够辨别文本内容是积极的还是消极的(褒义/贬义);比较复杂的情感分析,能够知道这些文字是否流露出恐惧、生气、狂喜等细致入微的情感。此外,情感的二......
  • umich cv-6-1 循环神经网络基本知识
    这节课中介绍了循环神经网络的第一部分,主要介绍了循环神经网络的基本概念,vanilla循环网络架构,RNN的一些应用,vanilla架构的问题,更先进的rnn架构比如GRU和LSTM循环神经网络基本知识vanilla循环网络架构应用与理解vanilla架构的问题LSTMvanilla循环网络架构在之前的讨论......
  • 硬件测试快速入门你必须了解的知识!
    硬件测试工程师这个职位越来越吃香,相对纯技术开发而言,要求不是那么高,但又需要一定技术含量。对于想从事技术领域,技术又不是那么自信的可以选择测试岗位,在测试中积累经验,晋升做技术开发,算是一个不错的过渡职位,对于想要从事技术领域的女生来说,也非常适合。测试工具的选择主要有以下......
  • python爬虫知识体系80页md笔记,0基础到scrapy项目高手,第(2)篇:http协议复习精讲
    本文主要学习一下关于爬虫的相关前置知识和一些理论性的知识,通过本文我们能够知道什么是爬虫,都有那些分类,爬虫能干什么等,同时还会站在爬虫的角度复习一下http协议。完整体系笔记直接地址:请移步这里共8章,37子模块,总计5.6w+字今天这一篇主讲:爬虫基础本阶段本文主要学......
  • Linux10月份知识随笔
    su-root管理员登陆touch创建空白文件查看文件:cat查看文件-n显示行号-A显示不可显示控制字符more逐页的显示文件内容,空格向下,b向上less对文件内容进行显示,up向上,down向下head可以查看文件前几行的内容,添加“-n”参数显示文件的前n行tail可以查看文件后几行的......
  • Django开发--知识回顾
    安装Djangopipinstalldjango创建Django项目django-adminstartprojectmysite注意:pycharm也可以创建Django项目如果用pycharm创建,记得settings.py中的DIR里的信息删除 创建APPpythonmanage.pystartappapp01pythonmanage.pystartappapp02p......
  • Raid阵列中硬盘损坏后,新硬盘可以直接换上吗? 及更换新硬盘方法 RAID学习与知识点
    RAID(RedundantArrayofIndependentDisks)是一种磁盘阵列技术,它通过将多个独立的硬盘组合成一个具有冗余能力的磁盘阵列,以实现提高存储性能和数据安全性的目的。在RAID中,多个硬盘被组合成一个逻辑单元,数据会被分布在各个硬盘上,从而提高了数据的读写速度和可靠性。同时,RAID还提供了......
  • 【每日三十六记 —— BGP知识点汇总大全】(第一弹)
    个人名片:......
  • 嵌入式linux系统中设备树基础知识
    笔记整理自百问网+正点原子前言之前分享的笔记:【Linux笔记】总线设备驱动模型中在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用设备树来描述。本篇笔记我们就来简单地学习一下设备树的一些知识。什么是设备树设备树简单理解......