
算法
-兮
Holly
展开
-
C++实现【启发式搜索】算法
用优先队列实现从起点出发,需要知道终点的坐标,根据起点和终点的距离进行预估// 'S' - 起点,'T' - 终点,'.' - 可以走的点,'*' - 最优解走过点路径,'x' - 去重已经走过了#include <iostream>#include <queue> //优先队列#include <cmath>using namespace std;struct node { int x, y; //点的坐标 int step; //到.原创 2022-04-09 00:59:22 · 1257 阅读 · 0 评论 -
图:拓扑排序 实现输出全部拓扑排序
求解过程:1)计算所有点的入度值2)寻找入度为0的点3)寻找这个点影响的其他连通点并把它们的入度值减去14)循环进行2+3步,直到所有点都找到可以判断图是否有环:若寻找不到入度为0的点则存在环#include <iostream>#include <queue> #include <cstring>using namespace std;struct edge { //链式前向星 - 实现遍历某点的所有边信息 int e; //边..原创 2022-03-07 17:03:38 · 1631 阅读 · 1 评论 -
最小生成树 - Prim算法
点进行求解1)随意定一个起点2)所有定的点中,向外面寻找所有可以连通的边3)每次选一条权值最小的边,作为最小生成树的新边,并得到定的新点4) 重复步骤2+3直至有n-1条边,此时为最小生成树优先队列实现Prim算法#include <iostream>#include <queue> #include <cstring>using namespace std;struct node { //记录每条边信息 int e; //边连通..原创 2022-03-07 16:27:56 · 172 阅读 · 0 评论 -
最小生成树 - Kruskal算法
边进行求解:1)按照n条边的权值从小到大进行排序2)从小到大进行遍历3)依次判断边的一侧与另一侧是否相连。不相连进行选中连接,相连则跳过4)重复步骤3直至有n-1条边,此时为最小生成树并查集+路径压缩优化实现Kruskal算法#include <iostream>#include <algorithm> using namespace std;struct edge { //记录每条边信息 int s; //边的一侧 int e; //..原创 2022-03-07 14:13:42 · 113 阅读 · 0 评论 -
基于队列优化的Bellman-Ford算法
Bellman-Ford算法求单源最短路径 ,暴力求解,时间复杂度O(n * m)可以处理带有负数的边(负权边)n条边最多需要遍历 n-1 次,时间复杂度O(n*m)#include <iostream>#include <cstring>using namespace std;struct edge { //记录每条边信息 int s; //边的起点 int e; //边的终点 int v; //边的权值};edge edg[2000原创 2022-03-07 13:17:44 · 207 阅读 · 0 评论 -
【链式向前星】算法 并求最短路径
链式前向星采取头插法的静态链表(数组模拟链表),存放着多个静态链表有2个数组:head一维数组存放边。另一个二维数组,第一维edge存放边;第二维存放next。edg[i] 的 next 表示与 i 这条边同起点的上条边的编号head一维数组的值的含义:head[i] : 头插法下以 i 为起点的最后一条边的编号#include <iostream>#include <cstring>using namespace std;struct edge原创 2022-03-04 17:00:05 · 201 阅读 · 0 评论 -
邻接矩阵:Floyd算法 邻接表:Dijkstra算法
//Floyd算法:求多元最短路径//时间复杂的 O(n^3)#include <iostream>using namespace std;int n, m, arr[1000][1000]; //n个点 m条边void Floyd(){ //表示从j点到k点的最短路径,其中的i为中间的中转点 for (int i = 1; i <= n; ++i) //i为中转在最外层 for (int j = 1; j <= n; ++j)原创 2022-03-04 10:39:13 · 744 阅读 · 0 评论