洛谷博客
一、Kruskal
P3366 【模板】最小生成树
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXN 200005
int n,m,cnt,flag,ans;
struct node{
int u,v,w;
}map[MAXN];
void add(int u, int v, int w){
map[++cnt] = (node){u,v,w};
}
bool cmp(node a, node b){
return a.w < b.w;
}
int prn[MAXN];
int find(int x){
if(prn[x] == x) return x;
return prn[x] = find(prn[x]);
}
void Union(int x,int y){
int t1,t2;
t1 = find(x);
t2 = find(y);
if(t1 != t2) prn[t1] = t2;
}
bool kruskal(){
sort(map+1,map+1+m,cmp);
for(int i=1;i<=n;i++) prn[i] = i;
for(int i=1;i<=m;i++){
int t1 = find(map[i].u);
int t2 = find(map[i].v);
if(t1 == t2) continue;
Union(t1,t2);
ans += map[i].w;
if(++flag == n-1) return 1;
}
return 0;
}
int main(void)
{
cin >> n >> m;
for(int i=1;i<=m;i++){
int u,v,w;
cin >> u >> v >> w;
add(u,v,w);
}
if(kruskal()) cout << ans;
else cout << "orz";
return 0;
}
二、Prim
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXN 400005
int n,m,ans;
int cnt;
int head[MAXN];
struct node{
int to,next,w;
}map[MAXN];
void add(int u,int v,int w){
map[++cnt] = (node){v,head[u],w};
head[u] = cnt;
}
int dis[MAXN],vis[MAXN];
void prim(){
memset(dis,0x3f,sizeof(dis));
dis[1] = 0;
int min,u;
for(int i=1;i<=n;i++){
min = 0x3f3f3f3f;
for(int k=1;k<=n;k++){
if(!vis[k] && min>dis[k]){
min = dis[k];
u = k;
}
}
vis[u] = 1;
ans += min;
for(int k=head[u];k;k=map[k].next){
int v = map[k].to;
int w = map[k].w;
if (dis[v] > w && !vis[v]){
dis[v] = w;
}
}
}
}
int main(void)
{
cin >> n >> m;
for(int i=1;i<=m;i++){
int u,v,w;
cin >> u >> v >> w;
add(u,v,w);
add(v,u,w);
}
prim();
cout << ans;
return 0;
}