AcWing 算法基础课 最小生成树、二分图
一、最小生成树
1、prim算法
和dijkstra算法很像
(1)朴素版 O(n^2)
适合稠密图
dijkstra算法每次更新到起点的距离,prim算法每次更新到集合的最短距离(用邻接点到当前被加入点的距离更新)(集合为已经生成的树)
858 Prim算法求最小生成树

1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int N=510; 6 7 int A_M[N][N]; 8 9 int n,m; 10 int dis[N]; 11 bool st[N]; 12 int prim() 13 { 14 int res=0; 15 memset(dis,0x3f,sizeof(dis)); 16 dis[1]=0;//dis初始化 17 for(int i=0;i<n;i++) 18 { 19 int t=-1; 20 for(int j=1;j<=n;j++) 21 { 22 if(!st[j]&&(t==-1||dis[j]<dis[t])) 23 t=j; 24 } 25 if(dist[t]==0x3f3f3f3f) return 0x3f3f3f3f; 26 res+=dist[t]; 27 for(int j=1;i<=n;j++) 28 dis[j]=min(dis[j],A_M[t][j]); 29 st[t]=true; 30 } 31 return res; 32 } 33 int main() 34 { 35 memset(A_M,0x3f,sizeof(A_M)); 36 cin>>n>>m; 37 while (m -- ) 38 { 39 int x,y,z; 40 cin>>x>>y>>z; 41 A_M[x][y]=min(A_M[x][y],z); 42 } 43 for(int i=0;i<N;i++) 44 A_M[i][i]=0; 45 int t=prim(); 46 if(t==0x3f3f3f3f) cout<<"impossible"; 47 else cout<<t; 48 return 0; 49 50 }
(2)堆优化版 O(mlogn)
适合稀疏图(稀疏图一般用Kruskal)
和堆优化dijkstra算法相似,一般不使用。
2、克鲁斯卡尔(Kruskal)算法 O(mlogm)
适合稀疏图 只需要存边,不需要建图
(1)将所有边按权重从小到大排序
(2)枚举每条边 a→b=c
如果当前a b不连通,则将这条边加入集合中(将a b所在集合连通)(并查集的应用)
859 Kruskal算法求最小生成树

1 p[N]; 2 int find(int x) 3 { 4 if(p[x]!=x) p[x]=find(p[x]); 5 return p[x]; 6 7 pair<int,pair<int,int>> edges;//w,a,b 8 cin>>edges; 9 int res=0,cnt=0; 10 sort(edges.begin(),edges.end()); 11 for(int i=1;i<=n;i++) 12 p[i]=i; 13 for(int i=0;i<m;i++) 14 { 15 auto [w,a_b]=edges[i]; 16 int a=find(a),b=find(b); 17 if(a!=b) 18 { 19 p[a]=b; 20 res+=w; 21 cnt++; 22 } 23 } 24 if(cnt<n-1) 25 puts("impossible"); 26 else 27 cout<<res<<endl;
二、二分图
1、染色法 O(n+m)
判断一个图是否为二分图。
重要性质,二分图当且仅当图中不含奇数环
深度优先遍历,返回是否染色成功。
bool dfs(int index,int color)
2、匈牙利算法 O(mn),实际运行时间一般远小于O(mn)
可以求二分图的最大匹配数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人