基础算法合集-图论

C++图论之常规最短路径算法的花式玩法(Floyd、Bellman、SPFA、Dijkstra算法合集) 权重图中的最短路径有两种,多源最短路径和单源最短路径。多源指任意点之间的最短路径。单源最短路径为求解从某一点出到到任意点之间的最短路径。算法。也称为插点法,是一种利用动态规划思想寻找权重图中多源点之间[最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授[罗伯特·弗洛伊德命名。算法。贝尔曼-福特算法取自于创始人理查德.贝尔曼和莱斯特.福特,暴力穷举法,算法效率较低。但是,能解决的问题范围较大,如负权问题。SPFA算法。 阅读详情

 本文将介绍数据结构图论部分中常见的算法

单源最短路径问题(用来计算一个点到其他所有顶点的最短路径)
Dijkstra(n*n)
1. 初始化: 先找出从源点V0到各终点Vk的直达路径(V0,Vk), 即通过一条弧到达的路径
2. 选择: 从这些路径中找出一条长度最短的路径(V0,u)
3. 更新: 然后对其余各条路径进行适当的调整
   若在图中存在弧(u,Vk),  且(Vo,u,Vk)<(Vo,Vk), 则以路径(Vo,u,Vk) 代替(Vo,Vk)
4. 把V分成两组:
   (1) S: 已求出最短路径的顶点的集合
   (2) T=V-S: 尚未确定最短路径的顶点集合
算法步骤:
1.初始时令S={V0}, T={其余顶点}
2.T中顶点对应的距离值用辅助数组D存放
   D[i] 初值: 若<V0,Vi>存在, 则为其权值; 否则为无穷  注: 从源点V0开始
3.从T中选取一个其距离值最小的顶点Vj, 加入S
4.对T中顶点的距离值进行修改: 若加进Vj 作中间顶点, 从V0到Vi的距离值比不加Vj的路径要短, 则修改此距离值
重复上述步骤, 直到S=V为止
代码实现:
辅助数组: 
-- 数组bool S[n]: 记录相应顶点是否已被确定最短距离
-- 数组D[n]: 记录源点到相应顶点路径长度
-- 数组Path[n]: 记录相应顶点的前驱顶点
1. 从D(T集合中)找最小值v   2. 将最小值对应的顶点, 加入S   3.更新D数组, Path数组
注:找最小值的时候要从D数组中为false的点中找,  并且不能为源点

#include<iostream>
using namespace std;
#define MVNum 20
#define MAXNUM 32767
typedef char VerTexType;  //顶点类型
typedef int ArcType;      //弧类型 
typedef struct{
	VerTexType vexs[MVNum];   //vexs代表顶点,arcs代表邻接矩阵
	ArcType arcs[MVNum][MVNum];
	int vexnum,arcnum;  //vexnum表示图中顶点的数量,arcnum表示图中边的数量
}AMGraph;
int LocateVex(AMGraph G,VerTexType v){
	for(int i=0;i<G.vexnum;i++){
		if(v==G.vexs[i]){
			return i;
		}
	} 
	return -1;
}
void CreateUDG(AMGraph &G){
	cin>>G.vexnum>>G.arcnum;
	for(int i=0;i<G.vexnum;i++){
		cin>>G.vexs[i];
	}
	for(int i=0;i<G.vexnum;i++){
		for(int j=0;j<G.vexnum;j++){
			G.arcs[i][j]=MAXNUM;
		}
	}
	VerTexType v1,v2;
	ArcType w;
	for(int k=0;k<G.arcnum;k++){
		cin>>v1>>v2>>w;
		int i=LocateVex(G,v1);
		int j=LocateVex(G,v2);
		G.arcs[i][j]=w;
	}
}
bool S[MVNum];
ArcType D[MVNum];
int Path[MVNum];
void ShortestPath_Dijkstra(AMGraph G,VerTexType u){
	int k=LocateVex(G,u);
	for(int i=0;i<G.vexnum;i++){
		S[i]=false;
		D[i]=G.arcs[k][i];
		if(D[i]<MAXNUM){
			Path[i]=k;
		}else{
			Path[i]=-1;
		}
	}
	S[k]=true;
	int min,v;
	for(int i=1;i<G.vexnum;i++){
		min=MAXNUM;
		for(int j=0;j<G.vexnum;j++){
			if(j!=k){
				if(!S[j]&&D[j]<min){
				  min=D[j];
				  v=j;
				}
			}
		}
		S[v]=true;
		for(int j=0;j<G.vexnum;j++){
			if(!S[j]&&D[v]+G.arcs[v][j]<D[j]){
				D[j]=D[v]+G.arcs[v][j];
				Path[j]=v; 
			}
		}
	}
	
}
int main(){
	AMGraph G;
	CreateUDG(G);
	char u;
	cin>>u;
	ShortestPath_Dijkstra(G,u);
	for(int i=0;i<G.vexnum;i++){
		cout<<D[i]<<" ";
	}
	return 0;
}

所有顶点间的最短路径
方法一:每次以一个顶点源点, 重复执行Dijkstra算法n 次
方法二:floyd 算法(n*n*n)
以上两种方法的时间复杂度是一样的
1. 初始时设置一个n阶方阵, 令其对角线元素为0, 若存在弧<Vi,Vj>, 则对应元素为权值; 否则为无穷
2. 逐步试着在原直接路径中增加中间节点, 若加入中间节点后路径变短, 则修改之; 否则, 维持原值. 所有顶点试探完毕, 算法结束
代码实现:
path 数组初始时为-1, 存储的是前驱节点
邻接矩阵, 对角线存储的是0, 有权值就存权值, 没有权值就存储无穷

#include<iostream>
using namespace std;
#define MVNum 20
#define MAXNUM 32767
typedef char VerTexType;  //顶点类型
typedef int ArcType;      //弧类型 
typedef struct{
	VerTexType vexs[MVNum];   //vexs代表顶点,arcs代表邻接矩阵
	ArcType arcs[MVNum][MVNum];
	int vexnum,arcnum;  //vexnum表示图中顶点的数量,arcnum表示图中边的数量
}AMGraph;
int LocateVex(AMGraph G,VerTexType v){
	for(int i=0;i<G.vexnum;i++){
		if(v==G.vexs[i]){
			return i;
		}
	} 
	return -1;
}
void CreateUDG(AMGraph &G){
	cin>>G.vexnum>>G.arcnum;
	for(int i=0;i<G.vexnum;i++){
		cin>>G.vexs[i];
	}
	for(int i=0;i<G.vexnum;i++){
		for(int j=0;j<G.vexnum;j++){
			if(i!=j){
			   G.arcs[i][j]=MAXNUM;
			}else{
			   G.arcs[i][j]=0;
			}
		}
	}
	VerTexType v1,v2;
	ArcType w;
	for(int k=0;k<G.arcnum;k++){
		cin>>v1>>v2>>w;
		int i=LocateVex(G,v1);
		int j=LocateVex(G,v2);
		G.arcs[i][j]=w;
	}
}
ArcType D[MVNum][MVNum];
int P[MVNum][MVNum];
void ShortestPath_Floyd(AMGraph G){
   for(int i=0;i<G.vexnum;i++){
   	 for(int j=0;j<G.vexnum;j++){
   	    D[i][j]=G.arcs[i][j];
		if(D[i][j]<MAXNUM&&i!=j){
			P[i][j]=i;
		}else{
			P[i][j]=-1;
		}	 
	 }
   }
   for(int k=0;k<G.vexnum;k++){  //我咧个n次尝试 
   	 for(int i=0;i<G.vexnum;i++){
   	    for(int j=0;j<G.vexnum;j++){
   	   	    if(D[i][j]>D[i][k]+D[k][j]){
   	   	   	   D[i][j]=D[i][k]+D[k][j];
   	   	   	   P[i][j]=P[k][j];  //从上一个Path二维表里面找,永远存储的是距离终点最近的前驱顶点(因为k是按顺序进行尝试的) 
		    }
	    }	
	 }
   }
}
void Print(int n){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(D[i][j]<MAXNUM){
			  printf("%4d(%2d)",D[i][j],P[i][j]);
	     	}else{
	     	  printf("%4c(%2d)",'#',P[i][j]);
			 }
		}
		printf("\n");
	}
} 
int main(){
	AMGraph G;
	CreateUDG(G);
	int n=G.vexnum;
	ShortestPath_Floyd(G);
	Print(n);
	return 0;
}

 总结来说第一种算法就是先找最小值, 第二种算法就是n次尝试

关键路径问题:拓扑排序
把工程计划表示为边表示活动的网络, 即AOE网, 用顶点表示事件, 弧表示活动, 弧的权表示活动持续时间
事件(顶点)表示在它之前的活动已经完成,在它之后的活动可以开始
源点:入度为0的顶点   汇点:出度为0的顶点
关键路径----路径长度最长的路径
路径长度----路径上各活动持续时间之和
ve(vj)----表示事件vj的最早发生时间
vl(vj)----表示事件vj的最迟发生时间
e(i)----表示活动ai的最早开始时间   l(i)----表示活动ai的最迟开始时间
l(i)-e(i)----表示完成活动ai的时间余量
关键活动----关键路径上的活动,即l(i)==e(i)(即l(i)-e(i)==0) 的活动
如何找到l(i) == e(i) 的关键路径?
    设活动ai用弧<j,k>表示,其持续时间记为:Wj,k
    则有:(1) e(i)==ve(j)           -> 直接查弧尾的最早发生时间
             (2) l(i) = vl(k) - Wj,k   -> 直接查弧头的最迟发生时间- 权值w
如何求ve(j) 和 vl(j) ?
事件j的最早发生时间?
(1) 从ve(1) = 0 开始向前递推
     ve(j) = Max{ve(i)+Wi,j},<i,j>->T, 2=<j<=n
     其中T是所有以j为头的弧的集合
事件i的最晚发生时间?
(2) 从vl(n)==ve(n) 开始向后向后递推
     vl(i)=Min{vl(j)-Wi,j}, <i,j>->S,1<=i<=n-1
     其中S是所有以i为尾的弧的集合
1.第一个是从源点往右算  2. 第二个是从汇点往左算 

生成树:所有定点均由边连接在一起, 但不存在回路的图
    - 一个图可以有许多棵不同的生成树
    - 所有生成树具有以下共同特点
1. 生成树的顶点个数与图的顶点个数相同
2. 生成树 是图的极小连通子图,去掉一条边则非联通
3. 一个有n个顶点的连通图的生成树有n-1 条边
4. 在生成树中再加一条边必然形成回路
5. 生成树中任意两个顶点间的路径是唯一的
最小生成树:给定一个无向网络,在该网的所有生成树中,使得各边权值之和最小的那颗生成树称为该网的最小生成树,也叫最小代价生成树
已上两种定义简单来说就是:1.生成树就是连通但是内部没有环,有n-1条边.  2. 最小生成树就是权值最小的生成树
MST性质:
在生成树的构造过程中,图中n个顶点分属两个集合:
     - 已落在生成树上的顶点集:  U
     - 尚未落在生成树上的顶点集:  V-U
接下来则应在所有连通U中顶点和V-U中顶点的边种选取权值最小的边(作为生成树的一条边,前提是不能有回路)
Prim 算法
设N={V,E} 是连通网, TE是N上最小生成树中边的集合        {a,b} a 代表点, b代表边
1. 初始令U={u0},{u0->V},TE={ }
2. 在所有u->U, v->V-U的边(u,v)->E中,找一条代价最小的边(u0,v0). 注: 就是权值最小的边
3. 将(u0,v0) 这条边并入集合 TE, 同时 v0这个点并入U
4. 重复上述操作直至U=V为止, 则T=(V,TE) 为N 的最小生成树  (意思就是把所有的点都选进集合U, 所以前面写的是U=V)

通俗解释:在U集合中选一个点和在U-V集合中选一个点, 使得这个权值的最小, 然后把弧上的顶点加入到集合U中, 直到U=T集合,得到的连通图就是最小生成树

#include<stdio.h>
#define max 32767
typedef struct
{
	char *date;
	int **array;
	int nodenumber,edgenumber;
} Graph;
struct close   //保存节点的权值和字符
{
	char date;
	int wed;
};
int LocateNode(Graph L,char ch)
{
	for(int i=0; i<L.nodenumber; i++)
		if(L.date[i]==ch) return i;
	return -1;
}
void CreatUDG(Graph &L)
{
	scanf("%d %d",&L.nodenumber,&L.edgenumber);
	//输入图的节点数和边数
	getchar();
	L.date=new char[L.nodenumber];   //节点数组
	L.array=new int*[L.nodenumber];  //邻接矩阵
	for(int i=0; i<L.nodenumber; i++)
	{
		L.date[i]=getchar();
		getchar();
		L.array[i]=new int[L.nodenumber];
	}
	for(int i=0; i<L.nodenumber; i++)
		for(int j=0; j<L.nodenumber; j++)
			L.array[i][j]=max;
	for(int k=0; k<L.edgenumber; k++)
	{
		char ch1,ch2;
		int w;
		scanf("%c %c %d",&ch1,&ch2,&w);
		getchar();
		int i=LocateNode(L,ch1);
		int j=LocateNode(L,ch2);
		L.array[i][j]=w;
		L.array[j][i]=w;
	}
}
int min(struct close *clos,int n)
{
	int k;
	for(int i=1; i<n; i++)
		if(clos[k].wed==0||(clos[i].wed!=0&&clos[i].wed<clos[k].wed)) k=i;
	return k;
}
void Prim(Graph L,char v)
{
	struct close clos[L.nodenumber];
	int k=LocateNode(L,v);
	for(int i=0; i<L.nodenumber; i++)
	{
		clos[i].date=v; 	//类似于一种前驱节点的感觉
		clos[i].wed=L.array[k][i];
	}//起始节点与其他节点建立联系
	clos[k].wed=0; //将起始节点的权值设置为0,表示起始节点已经被选中
	for(int i=1; i<L.nodenumber; i++)
	{
		k=min(clos,L.nodenumber);
		char u0=clos[k].date;   //存储的是k的前驱节点
		char v0=L.date[k];      //索引k下的节点字符
		printf("(%c,%c)\n",u0,v0);
		clos[k].wed=0;          //将选中节点的权值设置为0,表示已经加入到最小生成树
		for(int j=0; j<L.nodenumber; j++)  //这个循环遍历图中的所有节点。变量 j 表示当前正在检查的节点的索引
			//如果当前被选中的节点(索引为k),到其他(未被选入最小生成树)节点的权值比原来更小,那么
			if(L.array[k][j]<clos[j].wed)  
			{
				clos[j].date=L.date[k];  //更新前驱
                // 更新 clos 数组中节点 j 的字符为当前选中节点的字符
				clos[j].wed=L.array[k][j]; //更新权值
				//更新 clos 数组中节点 j 的权值为当前选中节点与节点 j 之间的边的权重
			}
	}
}
int main(){
	Graph L;
	CreatUDG(L);
	Prim(L,L.date[0]);  //传到Prim函数集合U中起始节点U0
	return 0;
}

 Kruskal算法
1.设 连通网 N=(V,E), 令最小生成树初始化状态为只有n个顶点而无边的非联通图 T={V,{ }}, 每个顶点自成一个联通分量
2. 在E中选取代价最小的边, 若该边依附的顶点落在 T中不同的连通分量上(即: 不能成环), 则将此边加入到T中; 否则, 舍去此边, 选取下一条代价最小的边
3.依次类推, 直至T中所有顶点都在同一连通分量上为止
注:通俗来讲就是, 直接把所有顶点都先加入到生成树T中, 然后从所有的边中一次找最短, 次短的边....进行连通,(但是不能成环)

注:最小生成树可能有很多个,同时Kruskal算法在寻找最小边的时候, 可以使用小顶堆{priority_queue<int,vector<int>,greater<int>> pq}, s所以Kruskal算法的时间复杂度就是堆排序的时间复杂度
两种算法比较:
算法名         Prim算法                     Kruskal算法
算法思想      选择点                         选择边
时间复杂度   O(n^2)(n为顶点数)     O(eloge)(e为边数)
适应范围      (稠密图)(点多的)          稀疏图(边多的)

#include<algorithm>
#include<iostream>
using namesapce std;
#define MVNum 20    //定点数的最大值
#define MANum 20    //边数的最大值
typedef char VerTexType;
typedef int ArcType;
typedef struct{
	VerTexType vexs[MVNum];
	int vexnum,arcnum;
}AMGraph;
typedef struct{
	VerTexType Head; //边的起始点
	VerTexType Tail; //边的终止点
	ArcType lowcost; //边上的权值
}Edge; //边的类型
Edge edges[MANum] //存储边信息的辅助数组
//辅助数组 VexSet,记录每个顶点所在联通分量编号
int VexSet[MVNum];
//确定顶点v在G中位置, 即顶点数组的下标
int LocateVex(AMGraph G,VerTexType v){
	for(int i=0;i<G.vexnum;i++){
		if(v==G.vexs[i]){
			return i;
		}
	}
	return -1;
}
void CreateAMGraph(AMGraph &G){
	cin>>G.vexnum>>G.arcnum;
	for (int i = 0; i <G.vexnum; i+)
	{
		cin>>G.vexs[i];
	}
	VerTexType v1,v2;
	ArcType w;
	for(int k=0;k<G.arcnum;k++){
		cin>>v1>>v2>>w;
        edges[k].Head=v1;
        edges[k].Tail=v2;
        edges[k].lowcost=w;
	}
}
//按边上的权值Lowcost进行排序
bool cmp(Edge a,Edge b){
    if(a.lowcost<b.lowcost){
    	return true;
    }
}
void MiniSpanTree_Kruskal(AMGraph G){
	 //按边上的权值Lowcost进行排序
     sort(edges,edges+G.arcnum,cmp);
     //初始化,每个顶点都是一个独立的连通分量
     for(int i=0;i<G.vexnum;i++){
     	VexSet[i]=i;
     }
     //反复执行,获取G.vexnum-1边
     for(int i=0;i<G.arcnum;i++){
     	int v1=LocateVex(G.edges[i].Head); //边的起始顶点存储位置的序号,那个顶点    通俗讲:就是找顶点存储在数组的那个位置
     	int v2=LocateVex(G.edges[i].Tail); //边的终止顶点存储位置的序号,那个顶点
     	int vs1=VexSet[v1];  //边的起始顶点所在联通分量的编号
     	int vs1=VexSet[V2];  //边的终止顶点所在连通分量的编号
     	if(vs1!=vs2){
     		printf("(%c,%c)\n",edges[i].Head,edges[i].Tail);
     		//同时将起始顶点所在联通分量和终止顶点所在的连通分量进行(合并)统一编号,变为起始顶点所在连通分量
     		//经过多次统一编号之后, 每个连通分量中就会包含多个顶点
     		for(int j=0;j<G.vexnum;j++){
     			if(VexSet[j]==vs2){
     				VexSet[j]=vs1;
     			}
     		}
     	}
     }
}
int main(){
	AMGraph G;
	CreateAMGraph(G);
	MiniSpanTree_Kruskal(G)
    return 0;
}

 感谢大家的点赞和关注,你们的支持是我创作的动力!

 

【知识点】图论续篇 - 最短路算法合集 最短路算法,见名知意,就是用于求出图中从某个顶点到另一个顶点最短距离的算法。最短路算法的应用极其广泛。本文将会以求解最短路为中心,围绕着展开叙述一些常见的最短路算法的原理和应用。 阅读详情

相关推荐

全面中文算法合集:深入理解与实践

算法是一系列定义明确的指令集合,用于完成特定的任务或解决问题。对于计算机科学和软件开发来说,算法是构建高效、可靠程序的基石。掌握算法知识对于IT专业人员来说至关重要,它不仅能够提升编程能力,还能够帮助我们优化解决方案,从而在竞争激烈的行业中脱颖而出。

weixin_32102617的博客 789

数据结构----图论基础算法的小合集(1)

又把数据结构图论一章看了一遍,把一些算法写了写。包括:DFS、DFS(邻接链表)、BFS、PRIM、KRUSKAL、DIJSTRA。 以下是代码: DFS( 邻接矩阵): #include #include #define maxn 1000 //аз╫с╬ьуС1 int mat[maxn][maxn],cnt; bool vis[maxn]; void init_mat() {

input1991的专栏 714

数学建模全面学习资源包:从基础到竞赛

数学建模是通过使用数学符号、公式以及图形等工具来描述、分析和预测实际问题的过程。它通常涉及将实际系统简化为可操作的模型,并应用数学技术对其进行求解。数学建模竞赛通常由一系列具有实际背景的问题构成,要求参赛者在限定时间内建立数学模型来解决这些问题。题型多样,可能包括连续性、离散性、确定性或随机性问题。竞赛旨在考察参赛者对数学知识的理解和应用能力,以及将复杂问题抽象化并构造数学模型的创新能力。优化问题是指在一定的约束条件下,寻找一组决策变量的取值,使得目标函数值达到最优(最大或最小)的问题。

weixin_42610671的博客 1025

字节大佬Leetcode刷题笔记,看完吊打问你算法的面试官

leetcode 题解,记录自己的 leetcode 解题之路。无论校招还是社招,技术面试中多多少少都会问到数据结构与算法相关的问题。例如最直接的一种,面试官上来就让手写一个快排的代码,或者给一段代码,要求分析时间复杂度和空间复杂度。其次,日常繁杂的业务工作往往容易让人忽略程序实现细节和原理。就 Java 来说,无论是其自身的基础 API,还是第三方提供的开源框架,都糅合很多优秀的数据结构和算法的设计思想。​ 最后,如果不重视程序的性能好坏,日复一日业务开发显然无法持续提升个人的编程和设计能力。

javaAnPou的博客 318

全面算法源码合集:从基础到应用

本文还有配套的精品资源,点击获取 简介:《算法源码合集》为编程学习者和开发者提供了一个宝贵的资源集合,它包括了多种常见算法的源代码实现,帮助学习者深入理解算法原理并将其应用于实际项目。合集详细介绍了排序、搜索、图论、动态规划、贪心和回溯等算法,并包含了算法的优化和性能调优细节。通过这些源码的学习,可以提升编程技能、数据结构设计和调试技巧,同时也为解决不断变化的算法挑战提供了...

weixin_29903713的博客 1091

C语言算法合集:从基础到高级应用

在计算机科学领域,算法是一系列定义明确的计算步骤,用于完成特定任务或解决问题。C语言作为一种广泛使用的编程语言,其简洁高效的特性使其成为实现算法的理想选择。本章将介绍C语言算法的基础知识,包括算法的基本概念、重要性以及如何在C语言中表达算法思想。排序算法可以根据其操作方式分类为比较排序和非比较排序。比较排序算法会通过比较元素的大小来决定元素的次序,其时间复杂度的下界为O(nlogn),而某些非比较排序算法如计数排序、基数排序和桶排序,它们的时间复杂度可达到线性,但这些算法有其适用的场景限制。

weixin_42451850的博客 1138

MATLAB——图论合集

近期在复习考研,以此来巩固一下相关知识——虽然考研肯定不能用MATLAB代码哈哈,不过在实际应用中解决问题还是很不错的,比C++易上手得多~)

软工科班,擅长Matlab、C++、微信小程序开发 2784

多模型对抗性审查:用AI辩论提升技术文档质量

在软件工程领域,技术文档是团队协作和项目成功的关键基础。传统的文档评审依赖人工经验,存在盲区和效率瓶颈。通过引入多模型对抗性审查机制,不同大语言模型从各自视角对文档进行批判性分析,模拟现实中的专家评审过程。这种技术方法的核心价值在于利用模型间的思维差异,自动发现单个视角容易忽略的边界情况、逻辑漏洞和隐含假设。在应用场景上,特别适合产品需求文档和技术规格书这类需要多角度审视的复杂文档。adversarial-spec工具通过Claude协调多模型辩论,实现从概念到实现的完整文档质量保障,显著提升文档的完整性和

weixin_42531579的博客 379

算法基础课【合集1】

1024

violet的博客 1972

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4451

【Agent实战】Agent Skills 深度解析:从原理到落地的完整指南

本文深入解析了Agent Skills的概念及其在AI协作中的实际应用。Skill是一种可被AI按需发现和加载的任务执行说明书,它将团队经验、规则和步骤固化为结构化文档,如SKILL.md。文章阐明了Skill与Prompt、MCP、Function Calling的关系,强调Skill专注于"怎么做"而非底层能力。重点介绍了SKILL.md的编写规范,包括元数据命名规则、描述技巧和正文内容优化,旨在帮助开发者高效构建可复用的知识资产,提升Agent的任务执行稳定性与专业性。通过清晰的示例和对比,为AI架构

少说,多做 115

图论算法合集

Dijkstra算法是一种用于计算单源最短路径的算法,即从一个指定的起始节点到图中所有其他节点的最短路径。该算法适用于有向图和无向图,但要求边的权重为非负数。Dijkstra算法利用贪心策略,逐步扩展最短路径树。Floyd-Warshall算法适用于计算所有节点对之间的最短路径,时间复杂度为O(n^3),适用于稠密图。Dijkstra算法用于计算单源最短路径,时间复杂度为O((V+E) log V),适用于边权非负的稀疏图。通过实际代码示例和详尽的注释,我们理解了两种算法的核心思想和实现细节。

CylMK的博客 580

72、海洋地理信息系统:电子海图的全面解析

本文全面解析了海洋地理信息系统中的电子海图技术,从AIS数据的应用、电子海图数据的存储与显示,到电子导航的发展趋势和S-100通用水文数据模型的推广,系统地阐述了电子海图在现代航海中的核心作用及其未来发展方向。

hhh00的博客 251

图论(三)--各种基础图算法总结

图论总结 G=(V,E),V代表图中节点的合集,E代表图中边或是关系的合集。 稠密图:图中E的条数接近V*V也就是,接近任意两点之间相连。 稀疏图:图中E的条数远小于V*V。 图的数据结构 图常用的有两种表示方式,邻接链表和邻接矩阵。 邻接矩阵和邻接链表都中存储的信息都只是点与点的关系。并不表示点的信息,如果要表示点的信息,需要一个额外的容器,存储。 比如,i节点代表某个村庄,该村庄有村名...

工作笔记 1万+

Oracle EBS Interface/API(29) - AP发票API

续上编文章《Oracle EBS Interface/API(28) - 客制化开发AP付款API》背景,介绍如调用官方提供标准AP发票API调用 用户界面 Invoices(Payables Manager->Invoices->Entry->Invoices) Open Interface Invoices(Payables Manager->Invoices->Entry->Open Interface Invoices) 快速参考 参考点 内容.

陈显平的专栏-Oracle EBS 1150

(四)美赛画图篇:画图模板+画图工具

美赛画图篇:画图模板+画图工具(一)画图模板(二)画图工具 因为散点图、折线图等多与数据有关,且需相关软件生成,故此处多是通用模板。直接替换文字内容即可。 (一)画图模板 1、Visio圆圈图 适合于:指标体系(E题常用) 点击下载:1 C币 如果不想花费且时间充足,悄咪咪地说,在visio-模板搜索可以找到很多。(稍微会耗一点时间) 2、简单指标体系图PPT 适合于指标体系 点击下载:0 C币...

weixin_43689393的博客 1万+

ACM 常用算法合集

【基础算法】 模拟算法:点击这里 数据排序:点击这里 高精度计算:点击这里 递推算法:点击这里 递归算法:点击这里 贪心算法:点击这里 分治法:点击这里 二分查找:点击这里 三分查找:点击这里 尺取法:点击这里 【进阶算法】 数据搜索:点击这里 字符串处理:点击这里 动态规划:点击这里 数据结构相关:点击这里 图论算法:点击这里 【数学相关】 数论:点击这里 组合...

Alex_McAvoy的博客 9703

【技能】OpenClaw Skills学习及手搓一个极简skill

本文介绍了OpenClaw Skills的基础概念与使用方法。Skills是OpenClaw代理使用工具的核心载体,通过SKILL.md文件定义技能属性和执行方式。技能加载遵循"工作区>本地>内置>自定义目录"的优先级规则。用户可通过ClawHub一键安装现成技能,也可自定义开发技能:创建技能目录,编写包含YAML元数据和执行指令的SKILL.md文件,放置于工作区skills目录进行测试。文章还介绍了多代理场景下的技能共享、插件集成以及安全注意事项,包括沙箱使用和敏感

海兰 3974

图论模板整理合集

还在持续更新, 模板还没发齐。最后更新时间:2019年12月6日 由于Github不太友好,蒟蒻就把PDF放到了百度云里 链接:https://pan.baidu.com/s/1yuII_btZspV5GVhAtlcl0Q 提取码:vvfn 最短路: SPFA模板 Dijkstra模板 Floyd模板 图论--最短路--第K短路(IDA*)(IDA Star)模板 图...

日拱一卒,功不唐捐 3044

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基础算法合集

/区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:符合条件的第一个位置// check(mid) 判断 [l,mid] 这个区间是否满足条件// 此时l==rreturn l;//区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:符合条件的最后一个位置// + 1 的原因是 l + r >> 1 == l, l = mid 这条就会导致死循环// check(mid) 判断 [mid,r] 这个区间是否满足条件// 此时l==r。

linyongzhang_的博客 1413

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

算法竞赛知识合集 目录(博客中转站)

《算法竞赛进阶指南》,跟着我学完这本书,你即可获得NOIP500分以上的能力或者得到ACM-ICPC金牌爷的实力!

繁凡さん的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ACM真题合集题解:提升算法能力的宝藏资源

ACM真题合集题解:提升算法能力的宝藏资源 【下载地址】ACM真题合集题解 ACM真题合集题解是一个专注于算法竞赛学习的优质资源库,收录了众多ACM竞赛中的经典题目及其详细解析。内容涵盖动态规划、图论、数论、字符串处理、数据结构等核心算法领域,每道题解不仅提供清晰的解题思路,还包含代码实现细节,帮助读者深入理解算法原理。...

gitblog_06775的博客 875

java常见算法合集

java常见算法合集

weixin_45226668的博客 1374

经典算法合集

经典算法合集。共勉啊亲~! 留着逐步攻克!!! ======================================================== 排序 排序算法 冒泡排序法 起泡法 鸡尾酒排序 桶排序 计数排序 归并排序 排序二叉树 鸽巢排序 基数排序 选择排序法 希尔排序 堆排序 快速排序算法 插入排序法 树形选择排序 ========...

强子的博客 1618

[转]图论基础题合集

[转]图论基础题合集原文地址最短路问题此类问题类型不多,变形较少POJ 2449 Remmarguts’ Date(中等) http://acm.pku.edu.cn/JudgeOnline/problem?id=2449 题意:经典问题:K短路 解法:dijkstra+A*(rec),方法很多 相关:http://acm.pku.edu.cn/JudgeOnline/showcontest

P.H.S 1250
上一篇: 基础算法合集-埃氏筛/欧拉筛
下一篇: HTML/CSS基础
一只鱼^_
博客等级 码龄3年 1073粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值