C++图论 最短路问题总结

news2024/11/16 3:31:39

目录

最短路问题

图的存储 

一、单源最短路

① 朴素Dijkstra O(n^2)

练习题

代码 

② 堆优化Dijkstra O(mlogn)

练习题

代码

③ Bellman_ford O(nm)

练习题

代码

④ Spfa O(n) - O(nm)

练习题

​代码

二、多源最短路

Floyd O(n^3)

练习题

代码


最短路问题

图的存储 

稠密图(边数很大,点数很少)用邻接矩阵存储,邻接矩阵即开辟一个二维数组,g[a][b]代表a到b有一条边

稀疏图(边数与点数差不多)用邻接表存储,邻接表为链表数组,代码如下:

const int N = 1e5+5;
int h[N], e[N], ne[N], idx;

一、单源最短路

单源指的是只能从一个结点出发

① 朴素Dijkstra O(n^2)

稠密图(邻接矩阵存储)常用:此时点数较小,n*n不会超时间限制,时间复杂度为O(n^2)

步骤

  1. 初始化距离数组和邻接矩阵,dist[1] = 0,dist[i] = 0x3f3f3f3f,g[i] [j] = 0x3f3f3f3f

  2. for外循环n(或者n-1)次遍历,再一层for循环遍历距离数组获取不在S数组里的离源点最短的点t

  3. 用t更新其他的点,把t加到S集合中

练习题

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围

1≤n≤500,
1≤m≤105,
图中涉及边长均不超过10000。

输入样例:

3 3
1 2 2
2 3 1
1 3 4

输出样例:

3

代码 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=505;
// g是邻接矩阵,因为题目数据是结点数500,边数10000,为稠密图,所以用邻接矩阵存储
//dist存放的是所有点到源点的最短距离
int g[N][N], dist[N];
//st数组是state,表示该点是否已经确定为最短路径点
bool st[N];
int n,m;
int dijkstra() {
    memset(dist, 0x3f, sizeof dist );
    dist[1] = 0;
    //第n个结点的到源点的最短路需要经过n步完成,也即确定前面n-1个点的最短路径,第n个结点才会是最短路径
    for(int i = 0; i < n ; i ++) {
        int t = -1; //dijkstra算法应用于无负权值的图
        //遍历每个点,找出目前为止离源点最近且还没确定最短路径的点
        for(int j = 1; j <= n; j ++) {
            //t等于-1确保至少第一个还没确定的点会被选中,dist[t] > dist[j]是更新t为未确定的最短的点
            if(!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
        }
        /*这一步其实做了一些无用功,因为这一步实际上是遍历t所有可以到达的点并更新,但是t一般
        不会连接其余所有的点,但是g被我们初始化为最大,又是取min,所以没有影响。
        且在t前面已经有一些点被确定最短了,这些点也就不会被更新了。
        */
        for(int j = 1; j <= n; j ++)    
            dist[j] = min(dist[j], dist[t] + g[t][j]);
        st[t] = true;
    }
    // 如果n仍然为0x3f3f3f3f代表着没有到n的最短路径。
    if(dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}
int main() {
    cin >> n >> m;
    int a, b, c;
    memset(g, 0x3f, sizeof g); //每个点之间的权值初始化为最大
    while(m--) {
        scanf("%d%d%d",&a,&b,&c);
        g[a][b] = min(g[a][b], c); //有重边取最小权值
    }
    cout << dijkstra() << endl;
    return 0;
}

② 堆优化Dijkstra O(mlogn)

稀疏图(邻接表存储)常用:此时点数较大,如果用朴素Dijkstra会超时,利用小根堆优化找dist数组中最小的未加入S集合的点,时间复杂度O(mlogn)

步骤

  1. 初始化距离数组和邻接表,dist[1] = 0,dist[i] = 0x3f3f3f3f,h[i] = -1

  2. 初始化小根堆,将{0, 1}放入堆,每次取出堆顶元素

  3. 如果被确定就跳过,否则加入S集合并更新其他点,被更新的点也要加入堆中进行下一次更新

练习题

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

输入格式

第一行包含整数 n 和 m。

接下来 mm 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 nn 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围

1≤n,m≤1.5*10^5
图中涉及边长均不小于 0,且不超过 10000。
数据保证:如果最短路存在,则最短路的长度不超过 10^9

输入样例:

3 3
1 2 2
2 3 1
1 3 4

输出样例:

3

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int ,int > PII;
const int N=1e6+5;
//稀疏图用邻接表存储,w为权重数组
int e[N],ne[N],w[N],dist[N],h[N],idx,n, m;
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(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII> > p;
    //first代表距离,second代表点
    p.push({0, 1});
    while(p.size()) {
        //这一步相当于之前for循环遍历拿出dist中距离源点的最短距离的点
        auto t = p.top();
        //弹出
        p.pop();
        //ver为点, distance为到源点的距离
        int ver = t.second, distance = t.first;
        //如果这个点已经确定了那就跳过
        if(st[ver]) continue;
        st[ver] = true;
        //更新与该点相连的其它点的dist
        for(int i = h[ver]; i != -1; i = ne[i]) {
            int j = e[i];
            if(dist[j] > dist[ver] + w[i]) {
                dist[j] = dist[ver] + w[i];
                p.push({dist[j], j});
            }
        }
    }
    if(dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}
int main() {
    int a, b ,c;
    cin >> n >> m;
    // 初始化链表数组头节点
    memset(h, -1, sizeof h);
    while(m--) {
        scanf("%d%d%d", &a, &b, &c);
        add(a,b,c);
    }
    cout << dijkstra() << endl;
    return 0;
}

注意:以上两种只适用于正权图

③ Bellman_ford O(nm)

Bellman - ford 算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在 n-1 次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成。
(通俗的来讲就是:假设 1 号点到 n 号点是可达的,每一个点同时向指向的方向出发,更新相邻的点的最短距离,通过循环 n-1 次操作,若图中不存在负环,则 1 号点一定会到达 n 号点,若图中存在负环,则在 n-1 次松弛后一定还会更新)

dijkstra为什么不能应用于负权值的边
首先我们要知道为什么dijkstra算法不能应用于有负权边得图中,因为dijkstra算法更新的时候是每次外循环都直接确定一个点为最短路径,一棒子打死,后面如果有负权边走到该点并且距离源点得距离才是最远的也更新不了了

存储结构
Bellman_ford用结构体简单存储即可,存下的是点对点以及权值,也即每条边以及其权值

稀疏图常用,直接使用结构体存储边的两端点和权值,时间复杂度为O(nm)

步骤

  1. 初始化距离数组,dist[1] = 0,dist[i] = 0x3f3f3f3f

  2. for外循环k次,备份dist的备份数组backup

  3. 内循环遍历所有的边,松弛dist[x.b] = min(dist[x.b], backup[x.a]+x.w);

  4. 判断是否有无最短路径到达n,一般是dist[n] > 0x3f3f3f3f / 2,具体看题目对于边的大小范围

为什么要备份呢,因为可能出现串联,也就是在一次更新中,前面已经更新的数据影响了后面的数据 

 此时的3会因为前面的2已经变化为1而更新成2,所以我们用上一次迭代的dist数组也就是backup来更新

练习题

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数

请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible

注意:图中可能 存在负权回路 。

输入格式

第一行包含三个整数 n,m,k。

接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

点的编号为 1∼n。

输出格式

输出一个整数,表示从 1 号点到 nn 号点的最多经过 k 条边的最短距离。

如果不存在满足条件的路径,则输出 impossible

数据范围

1≤n,k≤500
1≤m≤10000
1≤x,y≤n
任意边长的绝对值不超过 10000。

输入样例:

3 3 1
1 2 1
2 3 1
1 3 3

输出样例:

3

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=505, M=1e5+5;
int dist[N], backup[N], n,m,k;
struct Edge {
    int a, b, w;
}edge[M]; //边集,用结构体存储
void bellman_ford() {
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    for(int i = 0; i < k; i ++ ) {
        //有可能出现串联,所以需要先备份一份
        memcpy(backup, dist, sizeof dist);
        //通过遍历边数组不断更新每个点的最短值,不同于dijkstra算法的一板子拍死,每次都更新全部
        //以上一次更新k-1条边的backup数组为基础来更新,每次都取最小值,因此可以找出有无到达的最短值
        for(int j = 0; j < m; j ++ ) {
            int a = edge[j].a, b = edge[j].b, w = edge[j].w;
            dist[b] = min(dist[b], backup[a] + w);
        }
    }
    return ;
}
int main() {
    int a,b,w;
    cin >> n >> m >> k;
    for(int i=0;i<m;i++) {
        scanf("%d%d%d", &a, &b, &w);
        edge[i]={a,b,w};
    }
    bellman_ford();
    //根据具体题目来制定判断,题目的点数为500,每条边最大为10000,也就是最多会减500万
    //那么如果n大于0x3f3f3f3f / 2就意味着dist[n]没有被更新过
    if(dist[n] >= 0x3f3f3f3f / 2) cout << "impossible" << endl;
    else cout << dist[n] << endl;
    return 0;
}

④ Spfa O(n) - O(nm)

spfa是基于Bellman_ford优化的,在松弛的时候并不是每条边都需要更新,因此我们利用队列优化,将真正需要更新的点放入队列中,bellman_ford算法中,只有backup[a]被更新过,dist[b]才需要进行更新,所以当一个点被更新时就放入队列。简而言之:我更新过谁,我就把谁放入队列,时间复杂度O(nm)

步骤

  1. 是否初始化dist都可以,dist[1] = 0,dist[i] = 0x3f3f3f3f

  2. 每次取出队首元素进行更新,用st数组标记点是否在队列中,如果在的话无需重复添加

  3. 如果需要辨别是否有负权环的存在,使用cnt数组记录每个点的入队次数,>=n次则证明存在

练习题

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible

数据保证不存在负权回路。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 impossible

数据范围

1≤n,m≤10^5
图中涉及边长绝对值均不超过 10000。

输入样例:

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

输出样例:

2

​代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int ,int > PII;
const int N=1e6+5;
//稀疏图用邻接表存储,w为权重数组
int e[N],ne[N],w[N],dist[N],h[N],idx,n, m;
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 spfa() {
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    queue<int> p;
    p.push(1);
    st[1] = true;  //st数组标记的是点是否再队列中,重复放置没有任何意义
    while(p.size()) {
        auto t = p.front();  //取出队头元素进行更新
        p.pop();
        st[t] = false;
        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];
                if(!st[j]) {   //如果j变化了且队列中没有j这个点,那么就将点放进去
                    p.push(j);
                    st[j] = true;
                }
            }
        }
    }
}
int main() {
    int a, b ,c;
    cin >> n >> m;
    // 初始化链表数组头节点
    memset(h, -1, sizeof h);
    while(m--) {
        scanf("%d%d%d", &a, &b, &c);
        add(a,b,c);
    }
    spfa();
    if(dist[n] == 0x3f3f3f3f )    cout << "impossible" << endl;
    else cout << dist[n] << endl;
    return 0;
}

bellman_ford与spfa对于dist[n]的判断为什么不同?
因为队列里都是由起点更新到的点,不存在bellman-ford算法中未更新的点同样被边更新的情况。

注意:以上两种可适用于负权图,对于dist[n]的判定也是因为负权边的存在,所以具体看题目的范围进行判断

二、多源最短路

多源指的是能从任意一个结点出发

Floyd O(n^3)

Floyd用于处理多源汇最短路问题,即多个源点,需要直接得出点到点的最短路,时间复杂度为O(n^3)

步骤

  1. 初始化邻接矩阵,i == j,g[i] [j] = 0, else g[i] [j] = 0x3f3f3f3f

  2. 三重for循环 i,j,k 动态规划更新 g[j] [k] = min(g[j] [k], g[j] [i] + g[i] [k]);

练习题

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。

再给定 k 个询问,每个询问包含两个整数 x 和 y,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出 impossible

数据保证图中不存在负权回路。

输入格式

第一行包含三个整数 n,m,k。

接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

接下来 k 行,每行包含两个整数 x,y,表示询问点 x 到点 y 的最短距离。

输出格式

共 k 行,每行输出一个整数,表示询问的结果,若询问两点间不存在路径,则输出 impossible

数据范围

1≤n≤200
1≤k≤n^2
1≤m≤20000
图中涉及边长绝对值均不超过 10000。

输入样例:

3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3

输出样例:

impossible
1

代码

#include<iostream>
#include<cstdio>
using namespace std;
//INF如果用INT_MAX(21亿)的话用加法时会溢出
const int N = 205, INF = 1e9;
int g[N][N];
int n, m, k;
void floyd() {
    //动态规划,三重循环后ij位置是i到j的最短路径权值
    for(int i = 1 ; i <= n ; i ++ ) {
        for(int j = 1 ; j <= n; j ++ ) {
            for(int k = 1 ; k <= n; k ++ ) {
                /*
                f[1][j][k]就代表了,在考虑了1节点作为中间经过的节点时,从j到k的最短路径的长度。

                形式化说明如下:
                f[k][i][j]可以从两种情况转移而来:
                【1】从f[k−1][i][j]转移而来,表示i到j的最短路径不经过k这个节点
                【2】从f[k−1][i][k]+f[k−1][k][j]转移而来,表示i到j的最短路径经过k这个节点

                总结就是:f[k][i][j]=min(f[k−1][i][j],f[k−1][i][k]+f[k−1][k][j])
                从总结上来看,发现f[k]只可能与f[k−1]有关。
                */
                g[j][k] = min(g[j][k], g[j][i] + g[i][k]);
            }
        }
    }
}
int main() {
    cin >> n >> m >> k;
    int a, b, c;
    //多源点需要初始化每个点到自己为0,其它点为无穷大,dijkstra算法不用这样的原因是只有一个源点
    //直接初始化dist[1] = 0即可
    for(int i = 1; i <= n; i ++ ) {
        for(int j = 1 ; j <= n; j ++ ){
            if(i == j) g[i][j] = 0 ;
            else g[i][j] = INF;
        }
    }
    while(m--) {
        scanf("%d%d%d", &a, &b, &c);
        g[a][b] = min(g[a][b], c);
    }
    floyd();
    int x,y;
    while(k--) {
        scanf("%d%d", &x, &y);
        if(g[x][y] > INF / 2)
        printf("impossible\n");
        else printf("%d\n", g[x][y]);

    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 数据库访问方法

一 访问数据的两种基本方式 1 方式1&#xff1a;DataAdapter及DataSet ① 适合于“离线”处理&#xff1b; ② 自动建立Command对象&#xff1b; 方式2&#xff1a;DataReader ① 适合于只读数据&#xff0c;效率较高 它们都要使用Connection及Command 二 Connection对象…

Android解析服务器响应数据

文章目录Android解析服务器响应数据解析XML格式数据Pull解析方式SAX解析方式解析JSON数据使用JSONObject使用GSON的方式来解析JSON数据Android解析服务器响应数据 解析XML格式数据 通常情况下,每一个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交自己的…

多线程——概念及线程安全

文章目录多线程概念进程vs线程多线程的优势/好处/使用场景线程的状态创建线程的方式线程的启动Thread中,start()和run()有什么区别?Thread类中的常用方法join()获取当前线程引用线程休眠线程中断线程的属性多线程效率局部变量在多线程中的使用线程安全问题1.什么情况会产生线程…

replit搭建

本文章用于快速搭建“出去”的节点&#xff0c;很简单 每个月只有100G流量中间可能会停止运行&#xff0c;需要手动进入项目开启 1、需要注册一个Replit账号 点击注册 支持Github登录&#xff0c;其他登录也行 2、使用这个模板项目 随便起个名字 3、运行 进行完第二步&am…

【开源项目】第三方登录框架JustAuth入门使用和源码分析

第三方登录框架JustAuth入门使用和源码分析 项目介绍 JustAuth&#xff0c;如你所见&#xff0c;它仅仅是一个第三方授权登录的工具类库&#xff0c;它可以让我们脱离繁琐的第三方登录 SDK&#xff0c;让登录变得So easy! JustAuth 集成了诸如&#xff1a;Github、Gitee、支付…

九、kubernetes中Namespace详解、实例

1、概述 Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相的访…

花费数小时,带你学透Java数组,这些常用方法你还记得吗?

推荐学习专栏&#xff1a;Java 编程进阶之路【从入门到精通】 文章目录1. 数组2. 一维数组2.1 声明2.2 初始化2.3 使用3. 二维数组3.1 声明3.2 初始化3.3 使用4. 数组在内存中的分布5. 数组常用的方法5.1 Arrays.toString方法5.2 Arrays.copyOf方法5.3 Arrays.copyOfRange方法5…

麦克斯韦(Maxwell)方程组的由来

美国著名物理学家理查德费曼&#xff08;Richard Feynman&#xff09;曾预言&#xff1a;“人类历史从长远看&#xff0c;好比说到一万年以后看回来&#xff0c;19世纪最举足轻重的毫无疑问就是麦克斯韦发现了电动力学定律。” 这个预言或许对吧。可是费曼也知道&#xff0c;麦…

疫情三年划上终止符,好易点却把个人健康写入了产品基因

作者 | 牧之 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn随着12月26日国家卫健委发布的一纸公告&#xff0c;新冠肺炎正式更名为新冠感染。而从次年1月8日起&#xff0c;新冠将被实施「乙类乙管」。同时出入境也将采取开放性政策。这意味着&#xff0c;持续三年的「疫情时期」&#…

大数据技术——HBase简介

文章目录1. HBase定义2. HBase数据模型2.1 逻辑存储结构2.2 HBase 物理存储结构3. HBase基础架构1. HBase定义 HBase – Hadoop Database&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;利用HBase技术可在廉价PC Server上搭建起大规模结构化存…

基于BP神经网络的电力负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

SpringBoot系列之数据库初始化-jpa配置方式

【DB系列】数据库初始化-jpa配置方式 | 一灰灰Blog 上一篇博文介绍如何使用spring.datasource来实现项目启动之后的数据库初始化&#xff0c;本文作为数据库初始化的第二篇&#xff0c;将主要介绍一下&#xff0c;如何使用spring.jpa的配置方式来实现相同的效果 I. 项目搭建 1…

qt windeployqt打包 带多个dll的可执行程序时 应用程序无法正常启动

前提&#xff1a; 我的工程中包含5个子项目&#xff0c;项目1生成 camer.exe 项目2生成 dll1.dll &#xff0c;其中项目1 依赖后面的四个子项目。 但我在打包程序时&#xff0c;只运行了windeployqt F:\workspace\\bin-ne\camer.exe 将打包的程序放在纯净版本上时&#xff0…

Django开发

1.创建项目 创建项目&#xff1a; 删除内容&#xff1a; 2.创建APP 创建APP 注册APP&#xff1a; 3.设计表结构 4.在SQL中生成表 工具连接MySQL生成数据库&#xff08;在cmd中执行&#xff09;&#xff1a; create database Day1 DEFAULT CHARSET utf8 COLLATE utf8_…

融云获 51CTO 年终评选「中国 IT 行业政企数智办公优秀解决方案奖」

今日&#xff0c;51CTO 主办的“2022 年第十七届中国企业年终评选”榜单新鲜出炉&#xff0c;融云凭借百幄数智办公平台在政企信创办公领域的创新方案和独特设计&#xff0c;斩获“2022 年度中国 IT 行业政企数智办公优秀解决方案奖”。关注【融云 RongCloud】&#xff0c;了解…

B站年度产品榜 | 10项行业品类全面透析Z世代消费偏好

12月19日&#xff0c;哔哩哔哩官方发布“2022年 BILIBILI Z100”&#xff0c;这是B站官方推出的「UP主在用」年度产品榜&#xff0c;榜单包含10项产品类目87件产品&#xff0c;囊括美妆个护、数码3C、食品饮料、家居家电、交通出行、办公用品、鞋服箱包饰品、宠物用品、运动健康…

Linux线程控制

写在前面 我们今天来看线程的知识点&#xff0c;这个博客的内容很多&#xff0c;主要就是为了我们后面的网络做铺垫&#xff0c;最关键的是相比较于进程而言&#xff0c;线程是更加优秀的&#xff0c;我们现在的计算机大多采用的就是线程. 线程 我之前谈过在创建子进程的时候…

操作系统期末考试必会题库4——设备管理

1、DMA方式和中断控制方式的主要区别是什么&#xff1f; 2、面向块设备和面向流设备有何区别&#xff1f;各举一些例子 面向块的设备将信息保存在块中&#xff0c;块的大小通常是固定的&#xff0c;传送过程中一次传送一块。通常可以通过块号访问数据。磁盘和USB智能卡都是面向…

【Linux】Linux权限(一)文件权限和目录权限

Linux权限1.Linux权限的概念2.Linux的用户分类3.Linux的文件类型3.1如何看待Linux下的文件后缀4.Linux的文件权限5.Linux下切换用户指令6.Linux文件访问者的分类&#xff08;拥有者、所属组、other&#xff09;6.1root 和普通用户 与 拥有者和所属组和其他人的关系6.2 如何描述…

matlab中ginput函数的用法

仅用来记录自己学习中不会的函数 ginput函数&#xff1a;来自鼠标或光标的图形输入 一、语法 [x,y] ginput(n) [x,y] ginput [x,y,button] ginput(…) 二、说明 ginput 提高当前坐标区中的交叉线以供您标识图窗中的点&#xff0c;从而使用鼠标定位光标。图窗必须具有焦点…