图总结
图总结
思维导图
重要概念笔记
易混淆点:
- 生成树:
- 含有全部顶点的子图
- 拥有所有顶点和n-1条边(最小边)
- 极小连通子图
- 是连通的保证最少(n-1)条边的子图
- 极大连通子图
- 是子图,缺含有极大顶点数,同时含有依附于这些顶点的所有边.
疑难问题及解决方法
#include<stdio.h>
#include<stdlib.h>
struct road {
int v1;
int v2;
int cost;
} e[3004];
int v[1001] = { 0 };
int sort(const void* a, const void* b) {
return ((struct road*)a)->cost - ((struct road*)b)->cost;
}
int root(int x) {
if (v[x] == 0) return x;
else return v[x] = root(v[x]);
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
int i;
for (i = 0; i < m; ++i)
scanf("%d %d %d", &e[i].v1, &e[i].v2, &e[i].cost);
qsort(e, m, sizeof(struct road), sort);
int sum = 0;
for (i = 0; i < m; i++) {
if (root(e[i].v1) != root(e[i].v2)) {
v[root(e[i].v2)] = root(e[i].v1);
sum += e[i].cost;
}
}
int flag = 1;
for (i = 1; i <= n; i++) {
if (v[i] == 0 && flag) flag = 0;
else if (v[i] == 0) break;
}
if (i <= n) printf("-1");
else
printf("%d", sum);
}