我是靠谱客的博主 无奈鱼,这篇文章主要介绍【次小生成树】PAT (Top Level) 1016 Uniqueness of MST (35),现在分享给大家,希望可以做个参考。

Think:
1知识点:次小生成树
2题意:
(1):若最小生成树存在且唯一,第一行输出最小生成树权值和,第二行输出Yes
(2):若最小生成树存在且不唯一,第一行输出最小生成树权值和,第二行输出No
(3):若最小生成树不存在即图不连通,第一行输出”No MST”,第二行输出连通块数量
3反思:
(1):次小生成树代码实现部分i与j不要混淆
(2):次小生成树代码实现部分试探标记不要忘记当前边试探完成之后及时取消

PAT题集-题目链接

以下为Accepted代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct Edge{ int u, v, w; int flag; bool operator < (const Edge &b) const{ return w < b.w; } }edge[404014]; int f[504]; int tp, link[404014]; void init_f(int n); int get_f(int x); bool Merge(int x, int y); int main(){ int n, m, num, sum; while(~scanf("%d %d", &n, &m)){ for(int i = 0; i < m; i++){ scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].w); edge[i].flag = 0; } sort(edge, edge+m);/*按边权升序排序*/ init_f(n);/*Kruskal算法并查集标记数组初始化初始化*/ tp = 0, num = 0, sum = 0;/*路径记录变量以及Kruskal算法记录变量初始化*/ for(int i = 0; i < m; i++){ if(Merge(edge[i].u, edge[i].v)){ num++; sum += edge[i].w; link[tp++] = i; if(num == n-1) break; } } if(num != n-1){ int cnt = 0; for(int i = 1; i <= n; i++){ if(f[i] == i) cnt++;/*查询图内有几个连通块*/ } printf("No MSTn"); printf("%dn", cnt);/*输出图内连通块的数量*/ } else { printf("%dn", sum); int i, id, cnt, tmp; for(i = 0; i < tp; i++){ id = link[i]; edge[id].flag = 1;/*标记试探边*/ /*Kruskal算法*/ init_f(n); cnt = 0, tmp = 0; for(int j = 0; j < m; j++){ if(edge[j].flag == 0){/*判断当前边是否为试探边*/ if(Merge(edge[j].u, edge[j].v)){/*尝试下标为j的边是否可以加入当前的生成树*/ cnt++; tmp += edge[j].w;/*反思:j不要与i混淆写错*/ if(cnt == n-1) break; } } } edge[id].flag = 0;/*试探边试探完成之后取消试探标记*/ if(cnt == n-1 && tmp == sum) break;/*判断最小生成树是否唯一*/ } if(i < tp) printf("Non");/*提前终止代表最小生成树不唯一*/ else printf("Yesn"); } } return 0; } void init_f(int n){ for(int i = 0; i <= n; i++){ f[i] = i; } return; } int get_f(int x){ if(x == f[x]) return x; return f[x] = get_f(f[x]); } bool Merge(int x, int y){ int t1 = get_f(x); int t2 = get_f(y); if(t1 != t2){ f[t2] = t1; return true; } return false; }

最后

以上就是无奈鱼最近收集整理的关于【次小生成树】PAT (Top Level) 1016 Uniqueness of MST (35)的全部内容,更多相关【次小生成树】PAT内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(88)

评论列表共有 0 条评论

立即
投稿
返回
顶部