The Unique MST
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 20421   Accepted: 7183

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'. 

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!

Source

这题做得好开心,一次AC~

题意:给定一个联通图,推断最小生成树是否唯一。

题解:求出最小生成树后再求次小生成树。若次小生成树的长度与最小生成树相等就说明不唯一,否则唯一。

这是我的第一道次小生成树题,在这里总结下这个算法:

利用一个矩阵max【】【】表示最小生成树中随意两点路径上的最长边权值(关键!!),在求最小生成树时将已经选上的边标记为已用,求完后。遍历剩下未用的边,这条边若加入到最小树中必然构成回路。所以此时须要去掉原来树中那条回路中的最大值。也就是max矩阵存储的值。所以问题转换成找到一条未用的边,使得它跟相应于max矩阵里的边差值最小。遍历之后,次小生成树的值即为原最小生成树的值加上这个最小的差值。

#include <stdio.h>
#include <string.h>
#include <limits.h>
#define maxn 102
#define maxm (maxn * maxn) >> 1 int head[maxn], max[maxn][maxn];
struct Node{
int u, v, cost, next;
bool vis;
} E[maxm];
bool vis[maxn]; int mini(int a, int b){
return a < b ? a : b;
} int prim(int n, int m)
{
int u, i, tmp, j, len = 0, count = 0;
memset(max, 0x7f, sizeof(max));
memset(vis, 0, sizeof(vis));
vis[1] = 1;
while(count < n - 1){
for(i = 1, tmp = INT_MAX; i <= n; ++i){
if(!vis[i]) continue;
for(j = head[i]; j != -1; j = E[j].next){
if(vis[E[j].v]) continue;
if(E[j].cost < tmp){
tmp = E[j].cost; u = j;
}
}
}
++count; len += tmp;
for(i = 1; i <= n; ++i){
if(!vis[i]) continue;
max[i][E[u].v] = max[E[u].v][i] = E[u].cost;
}
vis[E[u].v] = 1; E[u].vis = 1;
}
return len;
} int getSecLen(int n, int m)
{
int min = INT_MAX, u, v, w;
for(int i = 0; i < m; ++i){
if(E[i].vis) continue;
u = E[i].u; v = E[i].v;
w = E[i].cost;
min = mini(min, w - max[u][v]);
if(min == 0) return 0;
}
return min;
} int main()
{
int t, n, m, i, minLen, secLen;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
memset(head, -1, sizeof(head));
for(i = 0; i < m; ++i){
scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].cost);
E[i].vis = 0; E[i].next = head[E[i].u];
head[E[i].u] = i;
}
minLen = prim(n, m);
secLen = getSecLen(n, m);
if(secLen == 0) printf("Not Unique!\n");
else printf("%d\n", minLen);
}
return 0;
}

POJ1679 The Unique MST 【次小生成树】的更多相关文章

  1. POJ1679 The Unique MST[次小生成树]

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28673   Accepted: 10239 ...

  2. POJ1679 The Unique MST —— 次小生成树

    题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total S ...

  3. POJ-1679 The Unique MST,次小生成树模板题

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K       Description Given a connected undirec ...

  4. POJ 1679 The Unique MST (次小生成树 判断最小生成树是否唯一)

    题目链接 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. De ...

  5. POJ_1679_The Unique MST(次小生成树)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  6. POJ_1679_The Unique MST(次小生成树模板)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23942   Accepted: 8492 D ...

  7. POJ 1679 The Unique MST (次小生成树)

    题目链接:http://poj.org/problem?id=1679 有t组数据,给你n个点,m条边,求是否存在相同权值的最小生成树(次小生成树的权值大小等于最小生成树). 先求出最小生成树的大小, ...

  8. poj1679The Unique MST(次小生成树模板)

    次小生成树模板,别忘了判定不存在最小生成树的情况 #include <iostream> #include <cstdio> #include <cstring> ...

  9. POJ 1679 The Unique MST (次小生成树kruskal算法)

    The Unique MST 时间限制: 10 Sec  内存限制: 128 MB提交: 25  解决: 10[提交][状态][讨论版] 题目描述 Given a connected undirect ...

  10. poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35999   Accepted: 13145 ...

随机推荐

  1. POJ 3468 A Simple Problem with Integers (splay tree入门)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 47944   ...

  2. Digital Adjustment of DC-DC Converter Output Voltage in Portable Applications

    http://pdfserv.maximintegrated.com/en/an/AN818.pdf http://www.maximintegrated.com/app-notes/index.mv ...

  3. LM358资料及引脚图

    LM358里面包括有两个高增益.独立的.内部频率补偿的双运放,适用于电压范围很宽的单电源,而且也适用于双电源工作方式,它的应用范围包括传感放大器.直流增益模块和其他所有可用单电源供电的使用运放的地方使 ...

  4. Non-Inverting Level Shifter : +/-5V signal into a 0 to 3.3V

    http://electronicdesign.com/boards/non-inverting-level-shifter-requires-only-one-op-amp-one-supply-v ...

  5. c# 四舍五入、上取整、下取整

    在处理一些数据时,我们希望能用“四舍五入”法实现,但是C#采用的是“四舍六入五成双”的方法,如下面的例子,就是用“四舍六入五成双”得到的结果: double d1 = Math.Round(1.25, ...

  6. MVC使用JCrop上传、裁剪图片

    JCrop用来裁剪图片,本篇想体验的是: 在视图页上传图片: 上传成功,跳转到另外一个编辑视图页,使用JCrop对该图片裁剪,并保存图片到指定文件夹: 裁剪成功后,在主视图页显示裁剪图片: 当然,实际 ...

  7. Spring Boot中使用redis的发布/订阅模式

    原文:https://www.cnblogs.com/meetzy/p/7986956.html redis不仅是一个非常强大的非关系型数据库,它同时还拥有消息中间件的pub/sub功能,在sprin ...

  8. Java中间件:淘宝网系统高性能利器

    [TechTarget中国原创]淘宝网是亚太最大的网络零售商圈,其知名度毋庸置疑,吸引着越来越多的消费者从街头移步这里,成为其忠实粉丝.如此多的用户和交易量,也意味着海量的信息处理,其背后的IT架构的 ...

  9. coursera课程Text Retrieval and Search Engines之Week 4 Overview

    Week 4 OverviewHelp Center Week 4 On this page: Instructional Activities Time Goals and Objectives K ...

  10. HBase性能调优(转)

    原文链接:http://www.blogjava.net/ivanwan/archive/2011/06/15/352350.html 因官方Book Performance Tuning部分章节没有 ...