迪杰斯特拉算法(求最短路径)

news2024/9/20 23:58:35

迪杰斯特拉算法(求最短路径)

迪杰斯特拉算法用于查找图中某个顶点到其它所有顶点的最短路径,该算法既适用于无向加权图,也适用于有向加权图。

注意,使用迪杰斯特拉算法查找最短路径时,必须保证图中所有边的权值为非负数,否则查找过程很容易出错。

迪杰斯特拉算法的实现思路

图 1 是一个无向加权图,我们就以此图为例,给大家讲解迪杰斯特拉算法的实现思路。

在这里插入图片描述

图 1 无向加权图

假设用迪杰斯特拉算法查找从顶点 0 到其它顶点的最短路径,具体过程是:

  1. 统计从顶点 0 直达其它顶点的权值,如下表所示:

表 1 顶点 0 直达其它顶点的权值

123456
总权值26
路径0-10-20-30-40-50-6

∞ 表示两个顶点之间无法直达,对应的权值为无穷大。

  1. 表 1 中,权值最小的是 0-1 路径,它也是从顶点 0 到顶点 1 的最短路径(如图 2 所示)。原因很简单,从顶点 0 出发一共只有 0-1 和 0-2 两条路径,0-2 的权值本就比 0-1 大,所以从 0-2 出发不可能找得到比 0-1 权值更小的路径。

在这里插入图片描述

图 2 最短路径 0-1

  1. 找到最短路径 0-1 后,沿 0-1 路径方向查找更短的到达其它顶点的路径,并对表 1 进行更新。

表 2 沿 0-1 最短路径更新表 1

123456
总权值262+5
路径0-10-20-1-30-40-50-6

绿色加粗的权值是已确认为最短路径的权值,后续选择总权值最小的路径时不再重复选择;红色加粗的权值为刚刚更新的权值。

更新后的表格如表 2 所示,沿 0-1 路径可以到达顶点 3,且 0-1-3 的总权值比 0-3 更小。表 2 中,总权值最小的路径是 0-2,它也是从顶点 0 到顶点 2 的最短路径,如下图所示。

在这里插入图片描述

图 3 最短路径 0-2

  1. 重复之前的操作,沿 0-2 路径方向查找更短的到达其它顶点的路径。遗憾地是,从顶点 2 只能到达顶点 3,且 0-2-3 的总权值比表 2 中记录的 0-1-3 更大,因此表 2 中记录的数据维持不变。

表 3 结合 0-2 最短路径更新表 2

123456
总权值267
路径0-10-20-1-30-40-50-6
  1. 表 3 中,总权值最小的是 0-1-3,它也是顶点 0 到顶点 3 的最短路径。

在这里插入图片描述

图 4 最短路径 0-1-3

沿 0-1-3 路径方向,查找到其它顶点更短的路径并更新表 3。更新后的表格为:

表 4 结合 0-1-3 最短路径更新表 3

123456
总权值2677+107+15
路径0-10-20-1-30-1-3-40-1-3-50-6
  1. 表 4 中,总权值最小的是 0-1-3-4,它是顶点 0 到顶点 4 的最短路径。

在这里插入图片描述

图 5 最短路径 0-1-3-4

从顶点 4 出发,查找顶点 0 到其它顶点更短的路径并更新表 4。更新后的表格为:

表 5 结合 0-1-3-4 最短路径更新表 4

123456
总权值267172217+2
路径0-10-20-1-30-1-3-40-1-3-50-1-3-4-6
  1. 表 5 中,总权值最小的路径是 0-1-3-4-6,它是顶点 0 到顶点 6 的最短路径。

在这里插入图片描述

图 6 最短路径 0-1-3-4-6

  1. 从图 6 可以看到,只剩下顶点 0 到顶点 5 的最短路径尚未确定。从顶点 6 出发到达顶点 5 的路径是 0-1-3-4-6-5,对应的总权值为 25,大于表 5 中记录的 0-1-3-5 路径,因此 0-1-3-5 是顶点 0 到顶点 5 的最短路径。

在这里插入图片描述

图 7 最短路径 0-1-3-5

由此借助迪杰斯特拉算法,我们找出了顶点 0 到其它所有顶点的最短路径,如下表所示:

表 6 最短路径

123456
总权值267172219

迪杰斯特拉算法的具体实现

了解了迪杰斯特拉算法的实现过程之后,接下来分别编写 C、Java 和 Python 程序真正地实现迪杰斯特拉算法。

仍以图 1 为例,迪杰斯特拉算法查找顶点 0 到其它顶点所有最短路径的 C 语言程序为:

#include <stdio.h>
#define V 20                   //顶点的最大个数
#define INFINITY 65535
typedef struct {
    int vexs[V];         //存储图中顶点数据
    int arcs[V][V];      //二维数组,记录顶点之间的关系
    int vexnum, arcnum;  //记录图的顶点数和弧(边)数
}MGraph;
//根据顶点本身数据,判断出顶点在二维数组中的位置
int LocateVex(MGraph * G, int v) {
    int i = 0;
    //遍历一维数组,找到变量v
    for (; i < G->vexnum; i++) {
        if (G->vexs[i] == v) {
            break;
        }
    }
    //如果找不到,输出提示语句,返回-1
    if (i > G->vexnum) {
        printf("no such vertex.\n");
        return -1;
    }
    return i;
}
//构造无向有权图
void CreateDG(MGraph *G) {
    printf("输入图的顶点数和边数:");
    scanf("%d %d", &(G->vexnum), &(G->arcnum));
    printf("输入各个顶点:");
    for (int i = 0; i < G->vexnum; i++) {
        scanf("%d", &(G->vexs[i]));
    }
    for (int i = 0; i < G->vexnum; i++) {
        for (int j = 0; j < G->vexnum; j++) {
            G->arcs[i][j] = INFINITY;
        }
    }
    printf("输入各个边的数据:\n");
    for (int i = 0; i < G->arcnum; i++) {
        int v1, v2, w;
        scanf("%d %d %d", &v1, &v2, &w);
        int n = LocateVex(G, v1);
        int m = LocateVex(G, v2);
        if (m == -1 || n == -1) {
            return;
        }
        G->arcs[n][m] = w;
        G->arcs[m][n] = w;
    }
}
//迪杰斯特拉算法,v0表示有向网中起始点所在数组中的下标
void Dijkstra_minTree(MGraph G, int v0, int p[V], int D[V]) {
    int final[V];//为各个顶点配置一个标记值,用于确认该顶点是否已经找到最短路径
    //对各数组进行初始化
    for (int v = 0; v < G.vexnum; v++) {
        final[v] = 0;
        D[v] = G.arcs[v0][v];
        p[v] = 0;
    }
    //由于以v0位下标的顶点为起始点,所以不用再判断
    D[v0] = 0;
    final[v0] = 1;
    int k = 0;
    for (int i = 0; i < G.vexnum; i++) {
        int min = INFINITY;
        //选择到各顶点权值最小的顶点,即为本次能确定最短路径的顶点
        for (int w = 0; w < G.vexnum; w++) {
            if (!final[w]) {
                if (D[w] < min) {
                    k = w;
                    min = D[w];
                }
            }
        }
        //设置该顶点的标志位为1,避免下次重复判断
        final[k] = 1;
        //对v0到各顶点的权值进行更新
        for (int w = 0; w < G.vexnum; w++) {
            if (!final[w] && (min + G.arcs[k][w] < D[w])) {
                D[w] = min + G.arcs[k][w];
                p[w] = k;//记录各个最短路径上存在的顶点
            }
        }
    }
}
int main() {
    MGraph G;
    CreateDG(&G);
    int P[V] = { 0 };   // 记录顶点 0 到各个顶点的最短的路径
    int D[V] = { 0 };   // 记录顶点 0 到各个顶点的总权值
    Dijkstra_minTree(G, 0, P, D);
  
    printf("最短路径为:\n");
    for (int i = 1; i < G.vexnum; i++) {
        printf("%d - %d的最短路径中的顶点有:", i, 0);
        printf(" %d-", i);
        int j = i;
        //由于每一段最短路径上都记录着经过的顶点,所以采用嵌套的方式输出即可得到各个最短路径上的所有顶点
        while (P[j] != 0) {
            printf("%d-", P[j]);
            j = P[j];
        }
        printf("0\n");
    }
    printf("源点到各顶点的最短路径长度为:\n");
    for (int i = 1; i < G.vexnum; i++) {
        printf("%d - %d : %d \n", G.vexs[0], G.vexs[i], D[i]);
    }
    return 0;
}

迪杰斯特拉算法查找顶点 0 到其它顶点所有最短路径的 Java 程序为:

import java.util.Scanner;
public class Dijkstra {
    static int V = 9; // 图中边的数量
    public static class MGraph {
        int[] vexs = new int[V]; // 存储图中顶点数据
        int[][] arcs = new int[V][V]; // 二维数组,记录顶点之间的关系
        int vexnum, arcnum; // 记录图的顶点数和弧(边)数
    }
    public static int LocateVex(MGraph G, int V) {
        int i = 0;
        // 遍历一维数组,找到变量v
        for (; i < G.vexnum; i++) {
            if (G.vexs[i] == V) {
                break;
            }
        }
        // 如果找不到,输出提示语句,返回-1
        if (i > G.vexnum) {
            System.out.println("顶点输入有误");
            return -1;
        }
        return i;
    }
    // 构造无向有权图
    public static void CreatDG(MGraph G) {
        Scanner scn = new Scanner(System.in);
        System.out.print("输入图的顶点数和边数:");
        G.vexnum = scn.nextInt();
        G.arcnum = scn.nextInt();
        System.out.print("输入各个顶点:");
        for (int i = 0; i < G.vexnum; i++) {
            G.vexs[i] = scn.nextInt();
        }
        for (int i = 0; i < G.vexnum; i++) {
            for (int j = 0; j < G.vexnum; j++) {
                G.arcs[i][j] = 65535;
            }
        }
        System.out.println("输入各个边的数据:");
        for (int i = 0; i < G.arcnum; i++) {
            int v1 = scn.nextInt();
            int v2 = scn.nextInt();
            int w = scn.nextInt();
            int n = LocateVex(G, v1);
            int m = LocateVex(G, v2);
            if (m == -1 || n == -1) {
                return;
            }
            G.arcs[n][m] = w;
            G.arcs[m][n] = w;
        }
    }
    // 迪杰斯特拉算法,v0表示有向网中起始点所在数组中的下标
    public static void Dijkstra_minTree(MGraph G, int v0, int[] p, int[] D) {
        int[] tab = new int[V]; // 为各个顶点配置一个标记值,用于确认该顶点是否已经找到最短路径
        // 对各数组进行初始化
        for (int v = 0; v < G.vexnum; v++) {
            tab[v] = 0;
            D[v] = G.arcs[v0][v];
            p[v] = 0;
        }
        // 由于以v0位下标的顶点为起始点,所以不用再判断
        D[v0] = 0;
        tab[v0] = 1;
        int k = 0;
        for (int i = 0; i < G.vexnum; i++) {
            int min = 65535;
            // 选择到各顶点权值最小的顶点,即为本次能确定最短路径的顶点
            for (int w = 0; w < G.vexnum; w++) {
                if (tab[w] != 1) {
                    if (D[w] < min) {
                        k = w;
                        min = D[w];
                    }
                }
            }
            // 设置该顶点的标志位为1,避免下次重复判断
            tab[k] = 1;
            // 对v0到各顶点的权值进行更新
            for (int w = 0; w < G.vexnum; w++) {
                if (tab[w] != 1 && (min + G.arcs[k][w] < D[w])) {
                    D[w] = min + G.arcs[k][w];
                    p[w] = k;// 记录各个最短路径上存在的顶点
                }
            }
        }
    }
    public static void main(String[] args) {
        MGraph G = new MGraph();
        CreatDG(G);
        int[] P = new int[V]; // 记录顶点 0 到各个顶点的最短的路径
        int[] D = new int[V]; // 记录顶点 0 到各个顶点的总权值
        Dijkstra_minTree(G, 0, P, D);
        System.out.println("最短路径为:");
        for (int i = 1; i < G.vexnum; i++) {
            System.out.print(i + " - " + 0 + " 的最短路径中的顶点有:");
            System.out.print(i + "-");
            int j = i;
            // 由于每一段最短路径上都记录着经过的顶点,所以采用嵌套的方式输出即可得到各个最短路径上的所有顶点
            while (P[j] != 0) {
                System.out.print(P[j] + "-");
                j = P[j];
            }
            System.out.println("0");
        }
        System.out.println("源点到各顶点的最短路径长度为:");
        for (int i = 1; i < G.vexnum; i++) {
            System.out.println(G.vexs[0] + " - " + G.vexs[i] + " : " + D[i]);
        }
    }
}

迪杰斯特拉算法查找顶点 0 到其它顶点所有最短路径的 Python 程序为:

V = 20   #顶点的最大个数
INFINITY = 65535    #设定一个最大值
P = [0]*V  # 记录顶点 0 到各个顶点的最短的路径
D = [0]*V  # 记录顶点 0 到各个顶点的总权值
class MGraph:
    vexs = []*V   #存储图中顶点数据
    arcs = [[0]*V for i in range(V)]    #二维列表,记录顶点之间的关系
    vexnum = 0    #记录图的顶点数和弧(边)数
    arcnum = 0
G = MGraph()
#根据顶点本身数据,判断出顶点在二维数组中的位置
def LocateVex(G,v):
    #遍历一维数组,找到变量v
    for i in range(G.vexnum):
        if G.vexs[i] == v:
            break
    #如果找不到,输出提示语句,返回-1
    if i>G.vexnum:
        print("顶点输入有误")
        return -1
    return i
#构造无向有权图
def CreateDG(G):
    print("输入图的顶点数和边数:",end='')
    li = input().split()
    G.vexnum = int(li[0])
    G.arcnum = int(li[1])
    print("输入各个顶点:",end='')
    G.vexs = [int(i) for i in input().split()]
    for i in range(G.vexnum):
        for j in range(G.vexnum):
            G.arcs[i][j] = INFINITY
    print("输入各个边的数据:")
    for i in range(G.arcnum):
        li = input().split()
        v1 = int(li[0])
        v2 = int(li[1])
        w = int(li[2])
        n = LocateVex(G,v1)
        m = LocateVex(G,v2)
        if m == -1 or n == -1:
            return
        G.arcs[n][m] = w
        G.arcs[m][n] = w
CreateDG(G)
#迪杰斯特拉算法,v0表示有向网中起始点所在数组中的下标
def Dijkstra_minTree(G,v0,P,D):
    #为各个顶点配置一个标记值,用于确认该顶点是否已经找到最短路径
    final = [0]*V
    #对各数组进行初始化
    for i in range(G.vexnum):
        D[i] = G.arcs[v0][i]
    #由于以v0位下标的顶点为起始点,所以不用再判断
    D[v0] = 0
    final[v0] = 1
    k =0
    for i in range(G.vexnum):
        low = INFINITY
        #选择到各顶点权值最小的顶点,即为本次能确定最短路径的顶点
        for w in range(G.vexnum):
            if not final[w]:
                if D[w] < low:
                    k = w
                    low = D[w]
        #设置该顶点的标志位为1,避免下次重复判断
        final[k] = 1
        #对v0到各顶点的权值进行更新
        for w in range(G.vexnum):
            if not final[w] and (low + G.arcs[k][w]<D[w]):
                D[w] = low + G.arcs[k][w]
                P[w] = k   #记录各个最短路径上存在的顶点
Dijkstra_minTree(G,0,P,D)
print("最短路径为:")
for i in range(1,G.vexnum):
    print("%d - %d的最短路径中的顶点有:"%(i,0),end='')
    print("%d-"%(i),end='')
    j = i
    #由于每一段最短路径上都记录着经过的顶点,所以采用嵌套的方式输出即可得到各个最短路径上的所有顶点
    while P[j] != 0:
        print("%d-"%(P[j]),end='')
        j = P[j]
    print("0")
print("源点到各顶点的最短路径长度为:")
for i in range(1,G.vexnum):
    print("%d - %d : %d"%(G.vexs[0], G.vexs[i], D[i]))

以上程序的执行过程为:

输入图的顶点数和边数:7 9
输入各个顶点:0 1 2 3 4 5 6

输入各个边的数据:
0 1 2
0 2 6
1 3 5
2 3 8
3 5 15
3 4 10
4 5 6
4 6 2
5 6 6
最短路径为:
1 - 0的最短路径中的顶点有: 1-0
2 - 0的最短路径中的顶点有: 2-0
3 - 0的最短路径中的顶点有: 3-1-0
4 - 0的最短路径中的顶点有: 4-3-1-0
5 - 0的最短路径中的顶点有: 5-3-1-0
6 - 0的最短路径中的顶点有: 6-4-3-1-0
源点到各顶点的最短路径长度为:
0 - 1 : 2
0 - 2 : 6
0 - 3 : 7
0 - 4 : 17
0 - 5 : 22
0 - 6 : 19

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

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

相关文章

相对位置编码(二) Relative Positional Encodings - Transformer-XL

1. Motivation 在Transformer-XL中&#xff0c;由于设计了segments&#xff0c;如果仍采用transformer模型中的绝对位置编码的话&#xff0c;将不能区分处不同segments内同样相对位置的词的先后顺序。 比如对于segmenti&#xfffd;&#xfffd;&#xfffd;&#xfffd;&…

pycharm安装opencv-python报错

问题一 通过pycharm中的Terminal窗口安装opencv-python错误如下&#xff1a; 上图所示为部分错误&#xff0c;全部错误如下&#xff1a; Building wheel for opencv-contrib-python (PEP 517) ... errorERROR: Complete output from command D:\anzhuanglujing\Anaconda\python…

从零开始之PID控制

从零开始系列之PID控制&#xff0c;宗旨就是以说人话的方式讲述它&#xff0c;真正的做到从零开始&#xff0c;小白一看就会&#xff0c;一学就废。 一、什么是PID控制&#xff1f; PID控制&#xff08;比例-积分-微分控制&#xff09;由比例单元&#xff08;Proportional&…

玩耍的猫咪【 InsCode Stable Diffusion 美图活动一期】

1️⃣ 工具介绍 InsCode是一个集成了在线IDE、在线AI编程、在线算力租赁、在线项目部署以及在线SD 模型使用的综合代码开发平台。 Stable Diffusion是目前最火的AI绘画工具之一&#xff0c;它是一个免费开源的项目。通过Stable Diffusion&#xff0c;可以很轻松的通过文字描述…

上半年结束,下半年继续冲!

前言: 这周直播也把雷神写的Ffmpeg推流器讲解完了&#xff0c;而一同时&#xff0c;一转眼间&#xff0c;2023年已经过半&#xff0c;正式进入了下半年&#xff1a; 因为上半年已经开始在做解析Ffmpeg 最新版本的源码&#xff0c;所以下半年&#xff0c;我会继续坚持讲解Ffmpeg…

“GPT+健康医疗”赋能医疗行业“数智化”发展,景联文科技提供高质量医疗数据库

近日&#xff0c;ChatGPT这个代表着通用版的大型语言模型以其出色的表现在全球互联网上引人注目。它所使用的GPT技术基础为人工智能应用开启了全新的世界。 “大模型时代已经到来。它已变成基础设施&#xff0c;变成算力&#xff0c;变成生产力。大模型可能有通用技术&#xf…

C++杂谈-友元和操作符重载

1、友元- friend 我的理解&#xff1a;通过设置友元函数和友元类来让外部函数来访问私有成员&#xff0c;这样虽然破坏了类的封装型和隐藏性&#xff0c;但是提高了程序的运行效率&#xff08;减少了某些安全性检查的过程&#xff09;。 友元函数和友元类统称友元&#xff0c;…

Nginx+Tomcat(多实例)实现动静分离和负载均衡(四层、七层)

目录 一、Tomcat 多实例部署 二、反向代理的两种类型 三、NginxTomcat实现负载均衡和动静分离&#xff08;七层代理&#xff09; 1.动静分离和负载均衡原理 2.实现方法 3.部署实例 &#xff08;1&#xff09;部署Nginx负载均衡服务器 &#xff08;2&#xff09;配置Tom…

C++之GNU C的__attribute__常用属性(一百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

使用 ZBrush、Ornatrix 和 Substance 3D Painter 重现哈利波特中的凤凰

今天瑞云渲染小编给大家带来了Ramn Tapia 分享 Phoenix 项目背后的工作流程&#xff0c;解释了如何在 Ornatrix 中完成修饰&#xff0c;并展示了纹理化过程。 介绍 你好&#xff0c;有创造力的读者朋友们 我的名字是Ramn&#xff0c;但在数字艺术领域&#xff0c;我的名字是ra…

【 Android11 无线热点开发 】无线AP开与关、无线AP信息获取

前言 前面四篇文章介绍完了有线网络、无线网络的开发过程&#xff0c;下面介绍下Android 11上网络的终结篇&#xff0c;无线热点的开发流程。 相关文章 1、【 Android11 WiFi开发 一 】WiFi列表获取与展示 2、【 Android11 WiFi开发 二 】WiFi连接、断开 3、【 Android11 Wi…

软件为什么要进行故障演练?主要为了什么?

随着现代社会的高度信息化和软件的广泛应用&#xff0c;软件的质量和可靠性对于保障用户体验和信息安全显得尤为重要。为了保证软件的稳定运行和即时响应&#xff0c;软件故障演练成为软件开发和运维过程中的重要环节&#xff0c;那软件为什么要进行故障演练&#xff1f;主要为…

IIC(I2C)协议

I2C&#xff08;Inter-Integrated Circuit&#xff09;:是一种串行通信协议&#xff0c;用于在集成电路之间进行数据传输。它由飞利浦公司开发&#xff0c;并广泛应用在各种电子设备和传感器之间进行通信。 I2C通信协议由两根线组成&#xff1a; 一个是用于数据传输的串行数据线…

JVM关键知识点整理,从入门到提高到实践

文章目录 基础篇一、了解JVM内存结构程序计数器&#xff08;线程私有&#xff09;Java虚拟机栈&#xff08;线程私有&#xff09;本地方法栈&#xff08;线程私有&#xff09;方法区&#xff08;线程共享&#xff09;堆&#xff08;线程共享&#xff09;运行时常量池直接内存 二…

Android12之解决-Werror,-Wunused类似问题万能公式(一百五十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Unity3d跨平台原理是什么?

Unity3D的跨平台原理是通过提供统一的开发环境和工具、抽象化的底层接口、平台适配和优化&#xff0c;以及导出和发布功能来实现的。这让开发者们能够在一个平台上创建游戏&#xff0c;并轻松地将其移植和发布到其他支持的平台上&#xff0c;实现游戏的跨平台兼容性。 基于以下…

【大数据之Hadoop】三十七、Hadoop HA高可用

1、HA概述 实现高可用最关键的策略是消除单点故障。HA分成各个组件的HA机制&#xff1a;HDFS的HA和YARN的HA。   Hadoop2.0之前&#xff0c;在HDFS集群中NameNode存在单点故障&#xff08;SPOF&#xff09;。 NameNode主要在以下两个方面影响HDFS集群&#xff1a; &#xff…

Java设计模式之一:观察者模式

目录 一、什么是观察者模式 二、如何使用观察者模式 三、观察者模式的优势和使用场景 一、什么是观察者模式 观察者模式是一种常见的设计模式&#xff0c;用于在对象之间建立一对多的依赖关系。在该模式中&#xff0c;一个主题&#xff08;被观察者&#xff09;维护了一个观…

三相交流电相序检测器/三相交流电相序指示器电路设计

三相交流电相序检测器 在使用三相交流电动机时&#xff0c;需要知道所连接三相电源的相序&#xff0c;若相序不正确&#xff0c;则电动机的旋转方向将与所需的相反&#xff0c;从而导致安全事故。本电路的功能为检测三相交流电源的相序 &#xff0c;并在相序正确的前提下自动接…

15 线程

文章目录 线程创建MFC使用CreateThread线程案例&#xff08;AfxBeginThread MFC 创建线程&#xff09;开始创建线程线程暂停继续结束线程全部代码 线程创建 #include <stdio.h> #include <Windows.h>//线程处理函数 //线程1 DWORD WINAPI DoWork1(LPVOID lpParame…