首页 > 其他分享 >12月26日总结

12月26日总结

时间:2025-01-10 19:23:53浏览次数:1  
标签:总结 26 12 dist temp int graph ++ numVertices

今日主要学习了图中寻找最短路径的算法:迪杰斯特拉算法和弗洛伊德算法
迪杰斯特拉算法:

include <stdio.h>

include <stdlib.h>

include <limits.h>

include <stdbool.h>

// 找到未确定最短路径的顶点中距离源点最近的顶点
int minDistance(int dist[], bool sptSet[], int numVertices) {
int min = INT_MAX, min_index;
for (int v = 0; v < numVertices; v++) {
if (sptSet[v] == false && dist[v] < min) {
min = dist[v];
min_index = v;
}
}
return min_index;
}

// Dijkstra 算法实现
void dijkstra(Graph* graph, int src) {
int dist[graph->numVertices];
bool sptSet[graph->numVertices];

for (int i = 0; i < graph->numVertices; i++) {
    dist[i] = INT_MAX;
    sptSet[i] = false;
}

dist[src] = 0;

for (int count = 0; count < graph->numVertices - 1; count++) {
    int u = minDistance(dist, sptSet, graph->numVertices);
    sptSet[u] = true;

    AdjListNode* temp = graph->adjLists[u];
    while (temp!= NULL) {
        int v = temp->dest;
        int weight = 1;  // 假设边的权重默认为 1,如有需要可修改
        if (sptSet[v] == false && dist[u] + weight < dist[v]) {
            dist[v] = dist[u] + weight;
        }
        temp = temp->next;
    }
}

// 输出源点到各个顶点的最短路径距离
for (int i = 0; i < graph->numVertices; i++) {
    printf("从源点 %d 到顶点 %d 的最短路径距离为: %d\n", src, i, dist[i]);
}

}

弗洛伊德算法:

include <stdio.h>

include <stdlib.h>

// Floyd 算法实现
void floyd(Graph* graph) {
int dist[graph->numVertices][graph->numVertices];
for (int i = 0; i < graph->numVertices; i++) {
for (int j = 0; j < graph->numVertices; j++) {
if (i == j) {
dist[i][j] = 0;
} else {
dist[i][j] = INT_MAX;
}
AdjListNode* temp = graph->adjLists[i];
while (temp!= NULL) {
if (temp->dest == j) {
dist[i][j] = 1; // 假设边的权重默认为 1,如有需要可修改
break;
}
temp = temp->next;
}
}
}

for (int k = 0; k < graph->numVertices; k++) {
    for (int i = 0; i < graph->numVertices; i++) {
        for (int j = 0; j < graph->numVertices; i++) {
            if (dist[i][k] + dist[k][j] < dist[i][j]) {
                dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }
}

// 输出任意两点间的最短路径距离
for (int i = 0; i < graph->numVertices; i++) {
    for (int j = 0; j < graph->numVertices; j++) {
        if (dist[i][j] == INT_MAX) {
            printf("从顶点 %d 到顶点 %d 无路径\n", i, j);
        } else {
            printf("从顶点 %d 到顶点 %d 的最短路径距离为: %d\n", i, j, dist[i][j]);
        }
    }
}

}

标签:总结,26,12,dist,temp,int,graph,++,numVertices
From: https://www.cnblogs.com/Genghao11/p/18664553

相关文章

  • 12月17日每日总结
    今日主要学习了图中寻找最小生成树的算法:克鲁斯卡尔算法和普利姆算法克鲁斯卡尔算法:构建边结构体:用于存储图中的边信息,包括边的两个端点以及边的权值。typedefstructEdge{intsrc;intdest;intweight;}Edge;对边进行排序:可以使用C语言标准库中的qsort函数来实现......
  • vscode配latex,用于latex排版,花了几个小时终于研究明白了(已总结)
    掉坑里了,切记texlive必须要安装,不然就是下面这样子步骤一:texlive安装链接:https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/下载完后双击ISO文件,再双击install-tl-windows.bat双击install-tl-windows.bat之后会自动跳转1-2个页面到下面这个页面......
  • 12月25日
    泛型的类型参数泛型的类型参数可以是任何有效的Java类型,但不能是基本数据类型。可以使用类、接口或自定义类型作为类型参数。类型参数的限制可以使用extends关键字对类型参数进行限制,表示类型参数必须是某个类的子类或实现某个接口的类。例如:javapublicclassBox{private......
  • 12月20日总结
    今日学习了队列的相关操作:定义:defineMAX_SIZE100//假设队列最大容量为100typedefstructQueue{intdata[MAX_SIZE];intfront;intrear;}Queue;初始化:voidinitQueue(Queue*q){q->front=0;q->rear=0;}入队操作:voidenqueue(Queue*q,intvalue){i......
  • 2024-12-1-#{}与¥{}的区别-response
    {}与¥{}的区别response实现重定向response响应字符数据response响应字节数据以及导入工具类实现响应......
  • 12月14日总结
    今日学习了,单链表的基本操作:定义:typedefstructListNode{intdata;structListNode*next;}ListNode;初始化:voidinsertAtHead(ListNode**head,intvalue){ListNode*newNode=(ListNode*)malloc(sizeof(ListNode));newNode->data=value;......
  • 12月15日总结
    今日全身心投入到数据结构中双链表的学习,相较于之前接触的单链表,双链表有着独特的魅力与复杂性。概念上,双链表的每个节点不仅包含指向后继节点的指针(如同单链表),还增设了指向前驱节点的指针。这一设计使得链表在双向遍历上独具优势,无论是从表头向表尾推进,还是反向操作,都能轻松实现......
  • 12月16日总结
    今日学习了双链表的相关操作:一、创建双链表创建双链表的第一步是定义节点结构体,它包含数据域、指向前驱节点的指针prev和指向后继节点的指针next。//双链表节点结构体定义typedefstructDoubleListNode{intdata;structDoubleListNode*prev;structDoubleListNode......
  • 12月17日总结
    今日重点学习数据结构中的栈,它遵循后进先出原则,类似单端进出的储物箱,顶部是唯一的数据出入口,这使其在处理特定顺序问题上优势显著。学习中探究了栈的基本操作,初始化时用结构体表示栈,含存储数据的数组(或链表)与指示栈顶的指针top,初始top设为-1代表空栈。入栈是先让top加1......
  • 12月22日
    今日深入学习了Java中的注解(Annotations)机制,这是Java语言的一个重要特性,用于为程序元素(如类、方法、字段等)提供元数据。注解不直接影响程序的直接运行,但可以被编译器、工具或运行时环境读取和处理,从而实现各种强大的功能,如代码生成、依赖注入、测试等。注解是Java语言中的一种特......