qbxt Day 3

——2020.1.19 济南 主讲:李奥

目录一览

1.图论(kruskal算法,最短路径算法,拓扑排序)

总知识点:图论

一、kruskal算法
1.目的:求图的最小生成树
2.算法描述:
先将所有的边按照权值从小到大排序,相同权值的边顺序随意。
然后按顺序依次考虑将这些边加入最小生成树中:
若加入这条边后,当前已加入的边出现环,则不加入这条边。
若加入这条边后,当前已加入的边不出现环,则加入这条边。
3.代码实现:

qsort(a+1,m,sizeof(edge),cmp); //对边进行排序
for(i=1;i<=n;i++) belong[i]=i;
for(i=1;i<=m;i++){
    if(belong[a[i].x]!=belong[a[i].y]){
        ans+=a[i].k;
        for(j=1;j<=n;j++){
            if(belong[j]==belong[a[i].x])
                            belong[j]=belong[a[i].y];
            }
        }
}

二、最短路径
1.最短路径指所经过的边的权值最小的路径。(以下讨论主要针对有向图。)
2.算法:
(1)SPFA算法
解决问题:单元最短路

注:边权可以为负但不能有负环

最短路径的前缀也一定是最短路径

SPFA算法需要借助队列,一般使用STL中的队列。
注:STL的queue使用方法:
z.push() 在队列尾加入一个元素

z.pop() 弹出队列的队头

z.front() 取队头

z.empty() 判断队列非空
算法时间复杂度上限:O(N^N)(上限是相当慢的)
算法结构:
先固定一个起始节点s(d[i]表示起始节点s节点到节点i的目前已知的最短距离)。
最开始所有d[i]为inf,d[s]=0;(即什么都不知道)
有一个等待更新别人的d值的队列z
最开始只有s有资格更新别人,所以z.push(z)
每次取出队列里的第一个节点,用他的d值更新与他相邻的节点的d值,被更新的节点又有资格更新别人,因此也加入队列。

代码实现:

z.push(s);
v[s]=1;
while(!z.empty()){
     x=z.front();
     z.pop();
     v[x]=0;
     for(k=first[x];k;k=a[k].next){
         y=a[k].y;
         if(d[x]+a[k].k<d[y]){
             d[y]=d[x]+a[k].k;
             if(!v[y]){
        z.push(y);
        v[y]=1;
         }
         }
     }
}

(2)Floyd算法
解决问题:所有节点之间的最短路

时间复杂度:O(n^3)

思想:
Dp :f[k][i][j]表示从i到达j,中途经过的节点的编号必须小于等于k的情况的最短路。

初始化f[0][i][j]即为邻接矩阵。

代码:

for(k=1;k<=n;k++)
  for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
         f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j]);
//采用滚动数组:
for(k=1;k<=n;k++)
  for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
         f[i][j]=min(f[i][j],f[i][k]+f[k][j]);

三、拓扑排序:
拓扑图:有向无环图

拓扑排序:
对于拓扑图的点进行排序,使得若有一条边x->y,则x一定排在y前面。
找到第一个节点之后,将这个节点从图中删除,重复直到原图的点全部被删除。
代码实现:

for(i=1;i<=n;i++){
    if(d[i]==0)z.push(i);
}
while(!z.empty()){
    x=z.front();
    z.pop();
    A[++len]=x;
    for(k=first[x];k;k=a[k].next){
        y=a[k].y;
        d[y]--;
        if(d[y]==0) z.push(y);
    }
}

-------------------------------------------------------THE END------------------------------------------------

清北学堂—2020.1提高储备营—Day 3(图论初步(二))的更多相关文章

  1. 清北学堂—2020.1提高储备营—Day 4 afternoon(动态规划初步(一))

    qbxt Day 4 afternoon --2020.1.20 济南 主讲:顾霆枫 目录一览 1.动态规划初步 2.记忆化搜索 3.递推式动态规划 4.记忆话搜索与递推式动态规划的转化 5.状态转移 ...

  2. 清北学堂—2020.1提高储备营—Day 4 morning(数论)

    qbxt Day 4 morning --2020.1.20 济南 主讲:李奥 目录一览 1.一些符号与基本知识 2.拓展欧几里得,逆元与欧拉定理 3.线性筛法与积性函数(非重点) 总知识点:数论 一 ...

  3. 清北学堂—2020.1提高储备营—Day 3(图论初步(一))

    qbxt Day 3 --2020.1.19 济南 主讲:李奥 目录一览 1.图论(图.图的存储方式.最小生成树的定义) 总知识点:图论 前言:众所周知,图论是一个非常重要的部分,而这次集训也可以算从 ...

  4. 清北学堂—2020.1提高储备营—Day 2 afternoon(线段树、树状数组)

    qbxt Day 2 afternoon --2020.1.18 济南 主讲:李佳实 目录一览 1.线段树 2.二叉搜索树(略过) 3.树状数组 总知识点:基础数据结构(本人初学感觉好难) 一.线段树 ...

  5. 清北学堂—2020.1提高储备营—Day 1 morning(模拟、枚举、搜索)

    qbxt Day 1 morning --2020.1.17 济南 主讲:李佳实 目录一览 1.模拟和枚举 2.基础搜索算法(DFS.BFS.记忆化搜索)以及进阶搜索算法(纯靠自学) 总知识点:基础算 ...

  6. 清北学堂—2020.1提高储备营—Day 2 morning(并查集、堆)

    qbxt Day 2 morning --2020.1.18 济南 主讲:李佳实 目录一览 1.并查集 2.堆 总知识点:基础数据结构 一.并查集 1.描述:并查集是一类十分常用的数据类型,它有着十分 ...

  7. 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)

    qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...

  8. 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记

    qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...

  9. 清北学堂 2020 国庆J2考前综合强化 Day7

    目录 1. 题目 T1 魔力石 题目描述 Sol T2 和 题目描述 Sol T3 数对 题目描述 Sol T4 海豹王国 题目描述 Sol 考场策略 1. 题目 T1 魔力石 题目描述 题目描述 小 ...

随机推荐

  1. Guava中强大的排序器Ordering使用

    一 创建排序器 排序器:可以用来为构建复杂的比较器,以完成集合排序的功能: 本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例. Ordering把很多基于Comparat ...

  2. 开源虚拟机Bochs安装以及踩坑

    因为想要写一个简单的操作系统,所以需要安装虚拟机来模拟出硬件,VMware不适合这个场景,因为会使用硬件级别的虚拟化,而bochs这个开源虚拟机,是用软件虚拟了所有的硬件,所以调试可以做到非常细的粒度 ...

  3. Unreal Engine 4 蓝图完全学习教程(五)—— 关于数组

    Ⅰ.数组的含义及使用 数组是能统一保存若干数值的特殊变量.数组可以指定编号.运用其中的值,因此能够有序地管理大量的数据. 首先试图将上次创建的msg变量修改成数组,在细节栏点击修改: 并选择“修改变量 ...

  4. nginx的进程结构实例演示

    nginx父子进程之间是使用信号进行管理的. nginx -s reload 会使之前的nginx子进程退出,生成新的nginx子进程 或者kill -SIGHUP 9170 kill -SIGTER ...

  5. 每日一练_PAT_B1001

    鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”.鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在 ...

  6. Spring Cloud第十三篇 | Spring Boot Admin服务监控

    本文是Spring Cloud专栏的第十三篇文章,了解前十二篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Clo ...

  7. asp.net core 3.x 身份验证-3cookie身份验证原理

    概述 上两篇(asp.net core 3.x 身份验证-1涉及到的概念.asp.net core 3.x 身份验证-2启动阶段的配置)介绍了身份验证相关概念以及启动阶段的配置,本篇以cookie身份 ...

  8. Codeforces_734_F

    http://codeforces.com/problemset/problem/734/F x|y + x&y = x+y. #include<iostream> #includ ...

  9. 用MYSQL的存储过程创建百万级测试数据表

    创建随机字符串函数,便于创建名称 DROP function if EXISTS rand_string; #创建一个指定字符个数的函数 create function rand_string(n I ...

  10. 在家想自学Java,有C语言底子,请问哪本书适合?

    一.问题剖析 看到这个问题,我想吹水两句再做推荐.一般发出这个疑问都处在初学编程阶段,编程语言都是相通的,只要你领悟了一门语言的"任督二脉",以后你学哪一门语言都会轻易上手.学语言 ...