prim:
#include <cstdio>
#include <cstring>
const int INF = 0x3f3f3f3f;
const int maxn = 110;
bool vis[maxn];
int lowc[maxn];
int prim(int cost[][maxn],int n) //dian bian hao 0 ~ n - 1
{
int ans = 0;
memset(vis,false ,sizeof vis);
vis[0] = true;
for(int i = 1;i < n;++i)
lowc[i] = cost[0][i];
for(int i = 1;i < n;++i)
{
int minc = INF;
int k = -1;
for(int j = 0;j < n;++j)
{
if(!vis[j] && minc > lowc[j])
{
minc = lowc[j];
k = j;
}
}
if(minc == INF) return -1; //原图不连通
ans += minc;
vis[k] = true;
for(int j = 0; j < n;++j)
if(!vis[j] && lowc[j] > cost[k][j])
lowc[j] = cost[k][j];
}
return ans;
}
kruskal
#include <cstdio>
#include <algorithm>
using namespace std;
const int max_edge_cnt = 5005;
const int max_point_cnt = 110;
struct edge{
int u,v,w;
}Edge[max_edge_cnt];
int tot = 0; //边的数量
int p[max_point_cnt];
int cmp(const edge x,const edge y)
{
return x.w < y.w;
}
int find(int x)
{
return p[x] == x ? x : p[x] = find(p[x]);
}
void addEdge(int a,int b,int c)
{
Edge[tot].u = a;
Edge[tot].v = b;
Edge[tot++].w = c;
}
int Kruskal(int n) //n是点的数量 0 ~ n - 1
{
for(int i = 0;i < n;++i)
p[i] = i;
sort(Edge,Edge + tot,cmp);
int cnt = 0;
int ans = 0;
for(int i = 0;i < tot;++i)
{
int u = Edge[i].u;
int v = Edge[i].v;
int w = Edge[i].w;
int x = find(u);
int y = find(v);
if(x != y)
{
ans += w;
p[x] = y;
cnt++;
}
if(cnt == n - 1) break;
}
if(cnt < n - 1) return -1; //不连通
else return ans;
}