最小生成树prim and kruskal +链式前向心
链式前向心
int add(int next,int v,int w){ e[++cnt].v=v; e[cnt].w=w; e[cnt].next=head[next]; head[next]=cnt; }
struct mp{ int v; int next; int w; }e[2000000];
int head[2000000],cnt=0;
prim算法
int dis[INF],vis[INF],now=1,ans = 0,minn=INF; int prim(){ memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); for(int i=1;i<n;i++){ vis[now]=1; for(int j=head[now];j;j=e[j].next){ if(dis[e[j].v]>e[j].w&&!vis[e[j].v]) dis[e[j].v]=e[j].w; } for(int j=1;j<=n;j++){ if(!vis[j]&&minn > dis[j]) { minn = dis[j]; now = j; } } ans += minn; } return ans; }
kruskal算法boruvka算法
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; #define INF 0x3f3f3f int n,m,f[INF],ans = 0, num = 0; struct mp{ int v; int next; int w; }e[INF]; bool cmp(mp a,mp b){ return a.w < b.w; } int find(int k){ if(f[k] == k) return k; else return find(f[k]); } void kruskal() { sort(e+1, e + 1 + m,cmp); for(int i = 1; i <= m; i++) { int t1 = find(e[i].next); int t2 = find(e[i].v); if(t1 == t2) continue; ans += e[i].w; f[t1] = t2; if(++num == n - 1) break; } } int main(){ cin >> n >> m; for(int i = 1; i <= n; i++) f[i]=i; for(int i = 1; i <= m; i++){ cin >> e[i].next >> e[i].v >> e[i].w; } kruskal(); cout << ans; return 0; }
推荐去看
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】