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 }           
View Code
复制代码

 

  (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;
View Code
复制代码

 

二、二分图

1、染色法 O(n+m)

  判断一个图是否为二分图。

  重要性质,二分图当且仅当图中不含奇数环

  深度优先遍历,返回是否染色成功。

  bool dfs(int index,int color)

2、匈牙利算法 O(mn),实际运行时间一般远小于O(mn)

  可以求二分图的最大匹配数

posted @   80k  阅读(51)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示