今日内容–最小生成树
kruskal()算法
需要借助并查集,首先用结构体存入边,将边进行排序成为升序排序,接着选取权值最小的边,再将边的两个端点,进行并查集的父亲判断,如果属于一个父亲,就不能添加这条边,否则会形成环,如果不属于一个父亲,就更新父亲信息,将其更新为同一个父亲,直到找到n-1条边,就生成了最小生成树。
struct node
{
int me,zd,q;
}edge[N*N];
int n,m;
int f[N];
int find(int x) {
return x == f[x] ? x :f[x]=find(f[x]);
}
bool cmp(node a, node b) {
return a.q < b.q;
}
void kruskal() {
int num = 0, ans = 0;
sort(edge + 1, edge + m + 1,cmp);
for (int i = 1;i <= n;i++) f[i] = i;
for (int i = 1;i <= m;i++) {
int f1 = find(edge[i].me);
int f2 = find(edge[i].zd);
if (f1 != f2) {
num++;
ans += edge[i].q;
f[f1] = f2;
}
if (num == n - 1) break;
}
}
今天ac了五道题,开心心。