IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构_第7讲 图的基本概念、存储与遍历 -> 正文阅读

[数据结构与算法]数据结构_第7讲 图的基本概念、存储与遍历

1.图的基本概念

(1) 有向图、无向图
(2) 度数(出度、入度)有向图(度数= 出度+ 入度)
(3) 简单图:不存在顶点到其自身的边,且同一条边不重复出现
(4) 路径、环、简单路径(路径不包括重复的点和边)
(5) 无向完全图:任意两个顶点之间都存在边,有n个顶点的无向完全图有 n × (n - 1) / 2条边

C n 2 C_n^2 Cn2?

(6) 有向完全图:任意两个顶点之间都存在方向护卫相反的两条弧,有n个顶点的无向完全图有 n × (n - 1) 条弧

A n 2 A_n^2 An2?

(7) 稀疏图&稠密图:有很少条边或弧的图称为稀疏图,反之称为稠密图,相对的概念。

2.图的存储及基本操作

(1) 邻接矩阵:适用于稠密图,可存有向图、无向图。常用。空间复杂度: O ( n 2 ) O(n^2) O(n2) 无法存重边

O ( n 2 ) O(n^2) O(n2)

image-20210729104030253

无向图每条边看成2条有向边

image-20210729104213673

(2) 邻接表:适用于稀疏图,可存有向图、无向图。常用。空间复杂度:O(n + m) O(m) 可存重边

可存储重边 使用最多

上机用的最多 vector set stack queue?

image-20210729104521920

image-20210729104800116

当有重边:

image-20210729104926532

(3) 邻接多重表,适用于稀疏图,可存无向图。不常用。空间复杂度:O(n + m) 可重存边

领接表 不方便找反向边

领接表优化为邻接多重表

上机不会用,因为oj中会用数组模拟链表,存储连续,相邻的就是反向边。

(4) 十字链表,适用于稀疏图,可存有向图、无向图。不常用。空间复杂度:O(n + m) 不能存重边

对邻接矩阵优化

image-20210729110331380

(5) 三元组表,适用于稀疏图,可存有向图,无向图。常用于Bellman-Ford算法、Kruskal算法。空间复杂度:O(m)

m条边 O ( m ) O(m) O(m)

image-20210729110519251

3.图的遍历

(1) 深度优先搜索。邻接表存储的时间复杂度: O ( n + m ) O(n + m) O(n+m)。邻接矩阵存储的时间复杂度: O ( n 2 ) O(n^2) O(n2)

DFS : 能走就必须走, 判重

深搜:能走就走,可能撞了南墙才会回头吧、

image-20210729111136419

(2) 广度优先搜索。邻接表存储的时间复杂度: O ( n + m ) O(n + m) O(n+m)。邻接矩阵存储的时间复杂度: O ( n 2 ) O(n^2) O(n2)

bfs 宽搜 求最短路径

4.拓扑排序

拓扑排序:存在拓扑排序 == 无环

所有边从前指向后

常用bfs O ( n + m ) O(n+m) O(n+m)

入度为 0 的点、 最后判断是否每个点是否遍历到了

AcWing 848. 有向图的拓扑序列

BFS

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5+5,M = 1e5+5;
int n,m;

struct Node {
    
    int id;
    Node* next;
    Node(int _id): id(_id),next(NULL){}
    
}*head[N];

int d[N] ; // 入度
int q[N] ; //数组模拟队列

void add(int a, int b)  // 添加一条边b->a  头插法 3->2->1;
{
    auto p = new Node(b);
    p->next = head[a];
    head[a] = p;
    
}
// bfs 广搜 
bool istopsort(){
    int hh = 0, tt  = -1 ;
    
    for(int i= 1; i<=n;i++){ // n个点  先找到入度为0的点入队列
        
        if(!d[i]) // 此点入度为0
        {
            q[++tt]= i ; // 队列入队
        }
        
    } 
    
    while(hh<=tt){ // 队列不为空
        
        int t = q[hh++]; // 取队头
        
        for(auto p= head[t];p;p=p->next){ //遍历 领接表 队头的链表head[t]
            if(-- d[p->id] == 0)
                q[++tt] = p->id;  // 队头去掉后; 后面相连的点入度-1 ; 为0的入队
            
        }
        
    }
    
    return tt == n - 1 ;  //队长是否等于n-1  判断是否所有的点都入队了,就是判断是否所有点遍历到了
    
}


int main()
{
    cin>>n>>m;  // n个点 m 条边
    
    while(m--){
        int a,b;
        cin>>a>>b;
        d[b]++ ;  // a->b 入度+1
        add(a,b); // 插入
        
    }
    // for(auto p=head[1];p;p=p->next)
    // cout << p->id<<endl;
    
    if(!istopsort()) cout<<-1<<endl;  // 不是拓扑排序
    else{
        // q[N] 打印队列
        for(int i=0;i<n;i++)
        cout<<q[i]<<' ';
        
    }
    
    return 0;
}

5.考题:2011-8、2012-5、2012-6、2013-7、2013-8、2014-7、2015-5、2016-6、2016-7、2017-3、2017-7、2018-7、2020-6

2011-8

image-20210731200155030

简单路径(路径不包括重复的点和边)

邻接矩阵:适用于稠密图,可存有向图、无向图。常用。空间复杂度:O(n^2) 无法存重边

2012-5

image-20210731200331352

广度

遍历每条边+每个点 O ( n + e ) O(n+e) O(n+e)

2012-6

image-20210731200451584

image-20210731201247684

i < = j i<= j i<=j

拓扑排序:所有边从前指向后 ,存在,但一定不唯一

2013-7

image-20210731200505895

image-20210731201626895

2013-8

image-20210731200534554

image-20210731200720120

广度即是层次遍历

这种题,我们一定要从 C , D 选项开始看 [dog]

D: a d e D错误

方法:看每个点深度

例如 D: abcdhefg : 01221122 ,不是从小到大即是错的

A:hcabdegf : 01122233

2014-7

image-20210731200736145

image-20210731200744719

C

image-20210731202243426

2015-5

image-20210731200806877

D

image-20210731202839991

2016-6

image-20210731202920328

D

1->2->5->4->3

深搜:能走就走,可能撞了南墙才会回头吧、

2016-7

image-20210731200835228

B

2017-3

image-20210731200858377

A

十字链表,适用于稀疏图,可存有向图、无向图。不常用。空间复杂度:O(n + m) 不能存重边, 对邻接矩阵优化

2017-7

image-20210731200910981

16条边,每条边提供2度

$216 - 43 -3*4= 8 $

最大2 ,$ 8/2= 4$

$ 3+4+4= 11$

2018-7

image-20210731200928722

D

image-20210731204125576

2020-6

image-20210731200947371

深搜来写拓扑排序 ,每次到叶节点,即是出度为0的点,遍历也就是相反的顺序

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:44:55  更:2021-08-01 14:46:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/14 17:02:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码