POJ 1679:The Unique MST(次小生成树&&Kruskal)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 19941 | Accepted: 6999 |
Description
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
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
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!
这道题就是要你推断是否为唯一的最小生成树。。
这也是我第一道次小生成树的题。。那个PDF资料真是太好了。。我用的是Kruskal。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath> using namespace std; const int max1 = 105;
const int max2 = 10005; struct node
{
int u, v, w;//边的顶点以及权值
int r;//用于记录边的序号
int used;//用于记录边是否被使用过
}edge[max2];//边的数组 int parent[max1];//顶点i所在集合相应树中的根节点
int n, m;//顶点数,边的个数
int cas; void start()//初始化
{
for(int i=1; i<=n; i++)
parent[i] = i;
} int find (int x)//查找并返回节点x所属集合的根节点
{
return parent[x] == x ? x : parent[x] = find ( parent[x] );
} bool cmp ( node a, node b )//按权值从小到大排序
{
return a.w < b.w;
} int Kruskal()//第一次求最小生成树
{
sort( edge+1, edge+m+1, cmp );
int ans = 0;
for(int i=1; i<=m; i++)
{
int e = edge[i].r;
int x = find( edge[i].u );
int y = find( edge[i].v );
if( x!=y )
{
parent[y] = x;
ans += edge[i].w;
edge[e].used = 1;
}
}
return ans;
} int Kruskal_again(int tt)//求次小生成树
{
sort( edge+1, edge+m+1, cmp );
int ans = 0;
for(int i=1; i<=m; i++)
{
if( tt==edge[i].r )
continue;
int x = find( edge[i].u );
int y = find( edge[i].v );
if( x!=y )
{
parent[y] = x;
ans += edge[i].w;
}
}
return ans;
} bool judge()//推断是否能就得最小生成树,即看是否有孤立的点
{
for(int i=1; i<=n; i++)
if( find(i) != find(1) )
return false;
return true;
} int main()
{
scanf("%d", &cas);
while( cas-- )
{
scanf("%d%d", &n, &m);
start();
for(int i=1; i<=m; i++)
{
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
edge[i].used = 0;
edge[i].r = i;
}
int flag = 0;
int ans1 = Kruskal();
for(int i=1; i<=m; i++)//一一枚举求最小生成树。。
{
if( !edge[i].used )
continue;
start();
int ans2 = Kruskal_again(i);//求除去此边的最小生成树
if( ans1 == ans2 && judge() )
{
flag = 1;//标记结论
break;
}
}
if( flag )
printf("Not Unique!\n");
else
printf("%d\n", ans1);
}
return 0;
}
POJ 1679:The Unique MST(次小生成树&&Kruskal)的更多相关文章
- poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35999 Accepted: 13145 ...
- POJ 1679 The Unique MST (次小生成树)
题目链接:http://poj.org/problem?id=1679 有t组数据,给你n个点,m条边,求是否存在相同权值的最小生成树(次小生成树的权值大小等于最小生成树). 先求出最小生成树的大小, ...
- POJ 1679 The Unique MST (次小生成树 判断最小生成树是否唯一)
题目链接 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. De ...
- POJ 1679 The Unique MST (次小生成树kruskal算法)
The Unique MST 时间限制: 10 Sec 内存限制: 128 MB提交: 25 解决: 10[提交][状态][讨论版] 题目描述 Given a connected undirect ...
- poj 1679 The Unique MST 【次小生成树】【模板】
题目: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 ...
- POJ1679 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(唯一的最小生成树)
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 ...
随机推荐
- the C programming language 阅读笔记2
1. 指针 1.1 自增符的使用 ++*p;//p指向的内容加一 (*p)++; //p指向的内容加一 *p++;//p本身自增 *++p; //p本身自增 因为诸如*和++这样的一元运算符在表达式求 ...
- 关于 实时推送技术--WebSocket的 知识分享
今天学习了关于WebSocket的知识,觉得挺有用的,在这记录一下,也和大家分享一下!!有兴趣的可以看看哦 WebSocket简介 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达 ...
- GMTED2010 高程数据下载
http://topotools.cr.usgs.gov/GMTED_viewer/viewer.htm
- 简易对象垃圾回收框架 for Delphi
(一).缘起 1.1 我的一个出错程序 程序名称:呼叫处理模块的压力测试工具,分为客户端和服务端. 开发工具:Delhpi 5 相关技术:客户端通过与服务端建立Socket连接来模拟一组电话机的拨入. ...
- JavaEE Tutorials (18) - Java EE平台安全介绍
18.1Java EE安全概述278 18.1.1简单的应用安全演示279 18.1.2安全机制特性281 18.1.3应用安全特点28118.2安全机制282 18.2.1Java SE安全机制28 ...
- C/C++代码静态检查工具Cppcheck在VS2008开发环境中的安装配置和使用
Cppcheck is an analysis tool for C/C++code. Unlike C/C++ compilers and many other analysis tools, it ...
- NOI2015 Day1
NOI2015 Day1 程序自动分析 题目描述:给出等式或不等式\(n\)条,问\(n\)条式子是否成立. solution: 用并查集处理等式,在判断不等式是否成立. 时间复杂度:\(O(n)\) ...
- S3C6410嵌入式应用平台构建(二)
[2014-4/11~4/14]经过之前的实验,对Uboot已经有了大体的了解,前我们已经把led灯给点亮,但这不是我们的根本目的,我们是要进入boot启动,经过两天的分析代码和反复的实验,终于可以进 ...
- React常用的命令解析
1.在目录终端下输入命令: browserify index.js -o bundle.js 该命令将require的所有文件统一打包在一个bundle.js文件中. 2.解释React文件 $ js ...
- NYOJ 7-街区最短路径问题(曼哈顿距离)
街区最短路径问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间 ...