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 ...
 
随机推荐
- 转 ——eclipse下进行Python开发 环境配置
			
python for eclipse插件安装1.下载python for eclipsepython for eclipse下载地址,如:org.python.pydev.feature-1.6.3. ...
 - 30款javascript脚本插件 jquery插件大全
			
Shifty Nav - a Fully Responsive JS CSS3 Mega Menu Show Demo Shifty Nav is a fully responsive CSS3 ...
 - rsyslog 日志格式和输出
			
日志格式: $EscapeControlCharactersOnReceive off #关闭rsyslog默认转译ASCII<32的所有怪异字符,包括换行符等 $template nginx- ...
 - libvirt python binding 变成了一个新项目
			
http://libvirt.org/git/ $ git clone git://libvirt.org/libvirt-python.git 2013年的事情了. $ git show a7a12 ...
 - How many ways(记忆化搜索)
			
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
 - Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy
			
1 前言 Python有许多IDE能够用,官方自己也带了一个,Eclipse也能够. 但我在使用各种IDE之后,发现用Sublime Text是最好用的一个.因此.我都是用Sublime Text来编 ...
 - NYOJ128 前缀式计算(栈的运用)
			
题目信息: http://acm.nyist.net/JudgeOnline/problem.php? pid=128 + 2 * + 3 4 5的值就是 37,详见输入输出. 输入 有多组測试数据, ...
 - C++ TR1 置随机数种子
			
1. #include <stdlib.h> #include <random> #include <iostream> using namespace std; ...
 - 链表的实现 -- 数据结构与算法的javascript描述 第六章
			
链表 链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链 结构示意图 : 链表头需要我们标识 head { element:head,next:obj1 ...
 - 使用 UML 进行业务建模:理解业务用例与系统用例的相似和不同之处
			
使用 UML 进行业务建模:理解业务用例与系统用例的相似和不同之处 作者:Arthur V. English 出处:IBM 本文内容包括: 背景 业务用例模型与系统用例模型有什么相似之处? 业 ...