POJ 1679 The Unique MST (最小生成树)
The Unique MST
题目链接:
http://acm.hust.edu.cn/vjudge/contest/124434#problem/J
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
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!
##题意:
求最小生成树并判断是否唯一.
##题解:
做法一:
先求一次最小生成树并记录MST中的边,枚举删除MST中的边,判断删除后的结果是否与删除前相同.
这样做一定要注意:删边后可能最小生成树不存在(求得的结果不联通).
很遗憾做了久都没过. 挖坑待填.
做法二:
考虑MST中每条边的作用:
kruskal在枚举边时,当一条边连接了并查集中不同的两个集合时,便把它加到结果中.
那么MST中边的作用是连接不同的两个集合.
如果存在多个MST,那么一定有一条或多条边可以起到相同的作用,即:
长度相等 且 连接集合的作用也相同.
基于以上理论,在kruskal过程中对长度相同的边作特判即可.
做法三:
直接求次小生成树.
##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 110
#define mod 100000007
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
struct node{
int left,right,cost;
}road[maxn*maxn];
vector ans_edge;
bool vis_edge[maxn];
int cmp(node x,node y) {return x.cost<y.cost;}
int p[maxn],m,n;
int find(int x) {return p[x]=(p[x]==x? x:find(p[x]));}
int kruskal()
{
int ans = 0;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=m;i++)
{
int x=find(road[i].left);
int y=find(road[i].right);
if(x == y)continue;
for(int j=i+1; j<=m; j++) {
if(road[j].cost != road[i].cost) break;
if(find(road[j].left) == x && find(road[j].right) == y)
return -1;
}
ans+=road[i].cost;
p[x]=y;
}
return ans;
}
int main(int argc, char const *argv[])
{
//IN;
int t; scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n,&m);
memset(road,0,sizeof(road));
for(int i=1; i<=m; i++) {
scanf("%d %d %d", &road[i].left,&road[i].right,&road[i].cost);
/*一定要维护两端点的相对关系,才方便判断是否有边起到了相同的作用*/
if(road[i].left > road[i].right) swap(road[i].left, road[i].right);
}
sort(road+1,road+m+1,cmp);
int ans = kruskal();
if(ans == -1) printf("Not Unique!\n");
else printf("%d\n", ans);
}
return 0;
}
POJ 1679 The Unique MST (最小生成树)的更多相关文章
- POJ 1679 The Unique MST (最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22668 Accepted: 8038 D ...
- poj 1679 The Unique MST 【次小生成树】【模板】
题目:poj 1679 The Unique MST 题意:给你一颗树,让你求最小生成树和次小生成树值是否相等. 分析:这个题目关键在于求解次小生成树. 方法是,依次枚举不在最小生成树上的边,然后加入 ...
- poj 1679 The Unique MST(唯一的最小生成树)
http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- poj 1679 The Unique MST (判定最小生成树是否唯一)
题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total S ...
- poj 1679 The Unique MST
题目连接 http://poj.org/problem?id=1679 The Unique MST Description Given a connected undirected graph, t ...
- POJ 1679 The Unique MST 【最小生成树/次小生成树模板】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22668 Accepted: 8038 D ...
- POJ 1679 The Unique MST 推断最小生成树是否唯一
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22715 Accepted: 8055 D ...
- poj 1679 The Unique MST【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24034 Accepted: 8535 D ...
- POJ 1679 The Unique MST (次小生成树kruskal算法)
The Unique MST 时间限制: 10 Sec 内存限制: 128 MB提交: 25 解决: 10[提交][状态][讨论版] 题目描述 Given a connected undirect ...
随机推荐
- 一些非常有用的html,css,javascript代码片段(持久更新)
1.判断设备是否联网 if (navigator.onLine) { //some code }else{ //others code } 2.获取url的指定参数 function getStrin ...
- Android Touch事件分发机制
参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...
- java开发之匿名内部类,接口的使用
下面的例子是Java.JDK7学习笔记上的 打算开发多人联机程序,对每个联机客户端,都会建立Client对象封装相关信息 1.Client.java public class Client { pri ...
- asp.net获取文件夹下的所有文件
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...
- 解决hibernate向mysql插入中文乱码问题
一.mysql的问题解决 MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与coll ...
- Eclipse小技巧<一>
Eclipse是一款特别好用的开源开发工具,基于插件的特性使其能够进行各种语言的开发.非常喜欢eclipse里的编码风格,感觉这个开发工具十分灵活,又有很多开发的小技巧能够提高开发效率,每次学到一个t ...
- SQL Server 2005的XML数据修改语言(XML DML)
转:http://www.microsoft.com/china/msdn/library/data/sqlserver/XMLDML.mspx?mfr=true 作为对XQuery语言的扩展,XML ...
- 使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法
使用HttpURLConnection下载文件时经常会出现 java.io.FileNotFoundException文件找不到异常,下面介绍下解决办法 首先设置tomcat对get数据的编码:con ...
- Android访问权限大全
android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/w ...
- [irving] C# Windows Beep 调用声音文件
方法一:Console.Beep(); 方法二:可以用Console.WriteLine("/a");来代替Beep(). MSDN:http://msdn.microsoft.c ...