图总结

图总结

思维导图

重要概念笔记

易混淆点:

  • 生成树:
    • 含有全部顶点的子图
    • 拥有所有顶点和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);
}
posted @ 2020-05-17 22:08  NiPShady  阅读(112)  评论(0编辑  收藏  举报