struct DSU{
vector<int> fa, siz;
DSU(int n): fa(n), siz(n, 1) { iota(fa.begin(), fa.end(), 0); }
int find(int x)
{
while(x != fa[x])
x = fa[x] = fa[fa[x]];
return x;
}
bool same(int x, int y)
{
return find(x) == find(y);
}
bool merge(int x, int y)
{
x = find(x);
y = find(y);
if(x == y)
return false;
siz[x] += siz[y];
fa[y] = x;
return true;
}
int size(int x)
{
return siz[find(x)];
}
};
from jiangly
int a[maxn][maxn];
int fr[maxn];
bool st[maxn];
int dist[maxn];
int prim()
{
int res = 0;
memset(dist,0x3f,sizeof dist);
memset(fr,-1,sizeof fr);
memset(st,0,sizeof st);
for(int i = 0; i < n; i ++)
{
int t = -1;
for(int j = 1; j <= n; j ++)
if(!st[j] && (t == -1 || dist[t] > dist[j]))
t = j;
if(i && dist[t] == inf) return inf;
if(i)
res += dist[t];
st[t] = true; // 将点t加入集合
for(int j = 1; j <= n; j ++)
{
if(dist[j]>a[t][j])
{
dist[j]=a[t][j];
fr[j]=t;//记录连向t的路径
}
}
}
return res;
}