The Unique MST

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 36692   Accepted: 13368

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! 题解:
次小生成树,维护一个两点间的最小距离,最后再向上加
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
#define line cout<<"------------------"<<endl;
const int MAXN=1e4+10;
const int INF=0x3f3f3f3f;
int n,m;
struct node{
int x,y;
int v;
bool vis;
}Edge[MAXN];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int pre[MAXN];
int Find(int a)
{
if(pre[a]==a)
return a;
return Find(pre[a]);
}
vector<int >G[110]; int maxd[110][110];//并查集划到一个树上后,树上任意两点之间的距离 void init()
{
for (int i = 1; i <=n; ++i) {
G[i].clear();
pre[i] = i;
G[i].push_back(i);
} }
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&Edge[i].x,&Edge[i].y,&Edge[i].v);
Edge[i].vis=false;
}
sort(Edge+1,Edge+1+m,cmp);
int sum=0;
for (int i = 1; i <=m ; ++i) {
int x=Find(Edge[i].x);
int y=Find(Edge[i].y);
if(x!=y)
{
pre[x]=y;
sum+=Edge[i].v;
int len1=G[x].size();
int len2=G[y].size();
for (int j = 0; j <len1 ; ++j) {
for (int k = 0; k <len2 ; ++k) {
maxd[G[x][j]][G[y][k]]=maxd[G[y][k]][G[x][j]]=Edge[i].v;//构建两点间最小距离
}
}
int tem[110];
for (int j = 0; j <len2 ; ++j) {
tem[j]=G[y][j];
}
for (int j = 0; j <len1 ; ++j) {
G[y].push_back(G[x][j]);
}
for (int j = 0; j <len2 ; ++j) {
G[x].push_back(tem[j]);
}
Edge[i].vis=true;
}
}
int cis=INF;
for (int i = 1; i <=m ; ++i) {//从不是最小生成树上的边,遍历向上加。找到次小生成树
if(!Edge[i].vis)
cis=min(cis,sum+Edge[i].v-maxd[Edge[i].x][Edge[i].y]);
}
if(cis>sum)
printf("%d\n",sum);
else
printf("Not Unique!\n");
} return 0;
}
//poj1679

  

POJ1679(次小生成树)的更多相关文章

  1. POJ1679(次小生成树)

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

  2. poj1679次小生成树入门题

    次小生成树求法:例如求最小生成树用到了 1.2.4这三条边,总共5条边,那循环3次的时候,每次分别不用1.2.4求得最小生成树的MST,最小的MST即为次小生成树 如下代码maxx即求最小生成树时求得 ...

  3. poj1679 次小生成树

    prim方法:先求过一遍prim,同时标记使用过得边.然后同时记录任意2点间的最大值. 每次加入一条新的边,会产生环,删去环中的最大值即可. #include<stdio.h> #incl ...

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

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

  5. 次小生成树(POJ1679/CDOJ1959)

    POJ1679 首先求出最小生成树,记录权值之和为MinST.然后枚举添加边(u,v),加上后必形成一个环,找到环上非(u,v)边的权值最大的边,把它删除,计算当前生成树的权值之和,取所有枚举加边后生 ...

  6. POJ1679 The Unique MST【次小生成树】

    题意: 判断最小生成树是否唯一. 思路: 首先求出最小生成树,记录现在这个最小生成树上所有的边,然后通过取消其中一条边,找到这两点上其他的边形成一棵新的生成树,求其权值,通过枚举所有可能,通过这些权值 ...

  7. POJ1679 The Unique MST 【次小生成树】

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

  8. 次小生成树(poj1679)

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

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

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

随机推荐

  1. 基于k8s的ES集群定期删除索引

    apiVersion: batch/v1beta1 kind: CronJob metadata: name: elasticsearch namespace: elasticsearch label ...

  2. ACM-ICPC(9/26)

    DP专题 多阶段决策:递推——逆推方式(难度较大),记忆化搜索方式,考虑当前决策层(cur) 01背包:变形众多,两种方式,一是考虑阶段的方式, ,另一种是刷表法 题目推荐: bzoj 4247 De ...

  3. 【转】Android总结之drawable(hdpi,mdpi,ldpi)文件夹的使用

    做Android有段时间了,但是好多细节还没有深入理解,关于Android中drawable文件夹的使用理解的就不是很深入. Android为开发者提供了两种解决适配问题的方法,第一种方式是使用dip ...

  4. 课堂练习:HTML-----------一般标签、常用标签

    []练习:一般标签.常用标签 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  5. POJ 2704 Pascal's Travels 【DFS记忆化搜索】

    题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  6. [18/11/26] this关键字、static关键字和静态块(及语句块)

    1.this关键字 this的本质就是“创建好的对象的地址”!  由于在构造方法调用前,对象已经创建.因此,在构造方法中也可以使用this代表“当前对象” [用法]   1.  在程序中产生二义性之处 ...

  7. Reverse Polish notation

    Reverse Polish notation is a notation where every operator follows all of its operands. For example, ...

  8. mybatis学习记录四——输入、输出映射

    6      输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 6.1.1     需求 完成用户信息的综合查询,需要传入查询条件很 ...

  9. 【luogu P2169 正则表达式】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2169 tarjan缩点 + SPFA 缩完点之后加边注意别写错. 也可以不用建两个图,可以在一张图上判断是否 ...

  10. TensorFlow安装环境的误区

    安装py一定要注意安装的版本,我一开始安装的3.7版本的,现在还没有支持,另外,看清楚自己电脑是32位还是64位的