The Unique MST
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 20786 | Accepted: 7314 |
Description
Given a connected undirected graph, tell if its minimum spanning tree is unique.
Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the following properties:
1. V' = V.
2. T is connected and acyclic.
Definition 2 (Minimum Spanning Tree): Consider an edge-weighted, connected, undirected graph G = (V, E). The minimum spanning tree T = (V, E') of G is the spanning tree that has the smallest total cost. The total cost of T means the sum of the weights on all the edges in E'.
Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the following properties:
1. V' = V.
2. T is connected and acyclic.
Definition 2 (Minimum Spanning Tree): Consider an edge-weighted, connected, undirected graph G = (V, E). The minimum spanning tree T = (V, E') of G is the spanning tree that has the smallest total cost. The total cost of T means the sum of the weights on all the edges in E'.
Input
The first line contains a single integer t (1 <= t <= 20), the number of test cases. Each case represents a graph. It begins with a line containing two integers n and m (1 <= n <= 100), the number of nodes and edges. Each of the following m lines contains a triple (xi, yi, wi), indicating that xi and yi are connected by an edge with weight = wi. For any two nodes, there is at most one edge connecting them.
Output
For each input, if the MST is unique, print the total cost of it, or otherwise print the string 'Not Unique!'.
Sample Input
2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2
Sample Output
3 Not Unique!
题意:
给出 T 组数组,每组数据给出 N, M,代表有有 N 个节点, M 条无向边,问是否有唯一的一颗最小生成树,有则输出这个值,没有则输出 Not Unique!
思路:
次小生成树。先用 Prim 算法算出最小生成树,记录最小生成树的边是什么,然后枚举生成树的边,一条条删去,删去后再求一遍生成树,如果所构成的图连通且这个值与原来最小生成树的值相等则输出 Not Unique,如果没有则说明唯一。注意每次都要判断是否连通。
AC:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef struct { int a, b, num; } node; node no[200005]; int root[505], path[505]; int n, m, cnt, sum; void init() { for (int i = 1; i <= n; ++i) root[i] = i; } int Find (int x) { return x == root[x] ? x : root[x] = Find(root[x]); } bool cmp (node a, node b) { return a.num < b.num; } bool test() { int num = 0; for (int i = 1; i <= n; ++i) { if (root[i] == i) ++num; if (num > 1) return false; } return true; } bool solve () { if (!test()) return false; for (int i = 0; i < cnt; ++i) { init(); int ans = 0; for (int j = 0; j < m; ++j) { if (j == path[i]) continue; int A = Find(no[j].a); int B = Find(no[j].b); if (A != B) { ans += no[j].num; root[A] = B; } } if (!test()) continue; if (ans == sum) return false; } return true; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); for (int i = 0; i < m; ++i) { scanf("%d%d%d", &no[i].a, &no[i].b, &no[i].num); } sort(no, no + m, cmp); init(); cnt = sum = 0; for (int i = 0; i < m; ++i) { int A = Find(no[i].a); int B = Find(no[i].b); if (A != B) { root[A] = B; path[cnt++] = i; sum += no[i].num; } } if (solve()) printf("%d\n", sum); else printf("Not Unique!\n"); } return 0; }
相关推荐
先利用prim算法求出最小生成树,然后通过往MST里加边来判断新生成的最小生成树是否具有最小的权值,POJ上The Unique MST(1679)题是要求判断最小生成树是否唯一,此题其实根本不用这样做,但是为了练习球次小生成树...
2. **替换最小生成树中的边**:找到最小生成树后,对于最小生成树中的每一条边,尝试用另一条未被使用的、权值更小的边来替换它,得到新的生成树,选择其中总权重最小的那个作为次小生成树。 这里我们主要介绍第二...
最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,特别是在计算机科学和网络设计中具有广泛应用。Prim算法是解决这个问题的一种有效方法,它能够找到一个无向加权图中连接所有顶点的边集,使得这些...
### 最小生成树(MST)问题详解 #### 一、最小生成树概念 最小生成树(Minimum Spanning Tree, MST)问题是计算机科学与图论领域中的一个重要问题,尤其是在网络设计、电路板布线等领域有着广泛的应用。对于一个连通的...
使用两种最小生成树的方法进行聚类,并对效果进行比较,处理了8种典型二维图像和压缩后的三维图像
这个主题主要涉及如何找到一个无向加权图的最小生成树(MST)的所有可能组合,并计算这些生成树的数量。在这个解题报告中,我们将深入探讨这个问题,并通过C++编程语言来实现解决方案。 首先,我们需要理解什么是...
最小生成树,使用PRIM方法生成最小生成树。
在计算机科学中,最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,尤其是在网络设计和优化问题中广泛应用。最小生成树允许我们找到一个无向加权图的所有节点间连接的边集合,使得这个集合构成的树...
最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,主要应用于寻找一个无向加权图中连接所有顶点的边的集合,使得这些边的总权重尽可能小。这个问题在实际生活中有着广泛的应用,例如电信网络设计、...
最小生成树(Minimum Spanning Tree, MST)是网络分析中的一个重要概念,尤其在解决连接多个节点的最小成本网络问题时非常实用。这个主题主要涉及到图论,它在构建通信网络、交通规划、社交网络分析等多个领域都有...
最小生成树(Minimum Spanning Tree, MST)是指在一个加权图中选取一个子图,该子图包含图中的所有顶点,并使得所有边的权重之和最小。对于一个无向连通图来说,如果图中没有环路,那么它的一个生成树就是最小生成树的...
- **解法1**:枚举MST中不在次小生成树中出现的边(n-1次),每次在剩下的边里求一次MST,时间复杂度为\(O(nm\log m)\)。 - **解法2**:预备结论:次小生成树一定可由MST更换一条边得到。证明让我们换种方式去看待这...
在图论中,最小生成树(Minimum Spanning Tree, MST)是一个非常重要的概念。对于一个连通的无向图来说,如果存在一个子图,它包含原图的所有顶点,并且这些顶点通过边互相连接形成一个树形结构,同时所有边的权重之...
最小生成树(Minimum Spanning Tree, MST)是图论中的一个经典问题,主要研究如何在一个加权无向图中找到一棵包含所有顶点且总权重最小的生成树。在实际应用中,最小生成树可以用于网络设计、电路布局等领域。传统的...
在一个加权无向图中,如果要连接所有的顶点,并使得所有边的总权重尽可能小,那么这个连接所有顶点的树就被称为最小生成树。常见的算法有克鲁斯卡尔(Kruskal's Algorithm)和普里姆(Prim's Algorithm)。 克鲁斯...
从给定的代码片段和描述来看,我们正在探讨如何构建一个最小生成树(Minimum Spanning Tree,MST),以连接图中的所有城市(节点)。最小生成树是在无向加权图中选择边的一个子集,使得所有顶点都被连接起来,并且这...
最小生成树(Minimum Spanning Tree, MST)是指在连通的加权无向图中找到一棵包括所有顶点的树,使得树中所有边的权重之和尽可能小。这个概念在诸如构建通信网络、交通规划等实际问题中有着广泛的应用。 1. **图的...
最小生成树(Minimum Spanning Tree,简称MST)是图论中的一个经典问题,涉及到在一个加权图中寻找一棵包含所有顶点的子图,使得这棵子图的总权重最小。在实际应用中,最小生成树可以用于解决网络设计、电路布线等...
本文将深入探讨如何使用C++语言实现最小生成树(Minimum Spanning Tree, MST)的算法。最小生成树问题是一个经典的图论问题,目标是在保证连通性的前提下,找到一个加权无向图中的边子集,使得这些边的总权重最小。 ...
最小生成树(Minimum Spanning Tree,简称MST)是指在一个加权无向图中找到一棵包含所有顶点的生成树,使得其边的权重之和最小。在实际应用中,最小生成树经常用于解决网络设计问题,例如城市之间的公路网络规划、...