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. 1588: [HNOI2002]营业额统计 (splay tree)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 5783  Solved: 1859[Submit][Stat ...

  2. Mybatis最入门---代码自动生成(generatorConfig.xml配置)

    [一步是咫尺,一步即天涯] 经过前文的叙述,各位看官是不是已经被Mybatis的强大功能给折服了呢?本文我们将介绍一个能够极大提升我们开发效率的插件:即代码自动生成.这里的代码自动生成包括,与数据库一 ...

  3. ansible saltstart puppet

    百台以下用ansible , 百台-千台用saltstart , 千台以上用puppet

  4. c3p0、dbcp、proxool、BoneCP比较

    1.1 测试环境: 操作系统:windows xp sp3 数据库:mysql 5.1 1.2 测试条件: initialSize=30; maxSize=200; minSize=30; 其余参数为 ...

  5. 26个Jquery1.4使用小技巧

    1. 禁止右键点击 1.       $(document).ready(function(){ 2.           $(document).bind("contextmenu&quo ...

  6. Qt5设置应用程序图标

    1.设置应用程序图标 简单三步走,搞定 ①创建一个图标格式的文件,可以网上在线将普通的图形格式转成.ico 格式的图标文件 http://www.faviconico.org/ 这个网站可以在线转换p ...

  7. Python中filter、map、reduce、lambda 的用法

    Python内置了一些非常有趣但非常有用的函数,充分体现了Python的语言魅力! filter(function, sequence):对sequence中的item依次执行function(ite ...

  8. Android循环ViewPager(二)

    上午没事写了一篇,下午有事,晚上回来看看感觉写的差点意思,上篇文章大概的关于循环是自己添加了两个空的View,看到网上还有一种就是在自定义的Adapter中getCount中返回最大值,然后destr ...

  9. Android中Intent的显示和隐式使用

    Android应用程序中组件之间的通信都少不了Intent的使用,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件, ...

  10. vue-router登录校验后跳转到之前指定页面如何实现

    两个需求:1.用户点击购买需要下单,并跳转到订单页面,但是如果用户没有登录的话,中间有登录验证,会拦截:2.点击购买的时候,登录校验成功了,跳转到订单页面时,订单已创建,去付款即可.3.处理拦截至登录 ...