判别MST是否唯一的例题。


POJ1679-The Unique MST

 

  题意:给定图,求MST(最小生成树)是否唯一,唯一输出路径长,否则输出Not Unique!

  题解:MST是否唯一取决于是否有两边权值相同(其中一条边在第一次求得的MST内,另一条在MST外)的情况。

     如果存在这样的边,则需要逐次删除MST内的该边,再次求MST,如果此次求得的MST路长与第一次MST相同,则确实存在不唯一的MST

     否则,一定不存在多条MST。

 //Kruskal-判断MST是否唯一
//Time:0MS Memory:868K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define MAX 101 struct Edge {
int u, v;
int w;
bool used; //First Used
bool del; //Kruskal是否不考虑此边
friend bool operator < (Edge e1, Edge e2) { return e1.w < e2.w; }
}e[MAX*MAX]; int n, m;
bool first; //是否第一次求MST
int fa[MAX];
int del[MAX*MAX], len; //须逐次删除的边
int minroad; //第一次MST结果 int Find(int x)
{
return fa[x] < ? x : fa[x] = Find(fa[x]);
} void Union(int r1, int r2)
{
r1 = Find(r1);
r2 = Find(r2);
int num = fa[r1] + fa[r2];
if (fa[r1] < fa[r2])
{
fa[r2] = r1;
fa[r1] = num;
}
else {
fa[r1] = r2;
fa[r2] = num;
}
} bool kruskal()
{
memset(fa, -, sizeof(fa));
int num = ;
int mind = ;
for (int i = ; i < m; i++)
{
if (e[i].del) continue;
if (Find(e[i].u) == Find(e[i].v)) continue;
Union(e[i].u, e[i].v);
if (first) {
minroad += e[i].w;
e[i].used = true;
}
mind += e[i].w;
if (mind > minroad) return true;
if (++num == n - ) break;
} return false;
} int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
memset(e, , sizeof(e));
for (int i = ; i < m; i++)
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w); len = ;
sort(e, e + m);
for (int i = ; i < m; i++)
if (e[i].w == e[i + ].w)
{
if(del[len-] != i) del[len++] = i;
del[len++] = i + ;
} minroad = ;
first = true;
kruskal();
first = false; bool unique = true;
for (int i = ; i < len; i++)
{
if (!e[del[i]].used) continue; //使用过的才删除
e[del[i]].del = true; //删除
if (!kruskal())
{
printf("Not Unique!\n");
unique = false; break;
}
e[del[i]].del = false; //恢复
} if (unique)
printf("%d\n", minroad);
} return ;
}

ACM/ICPC 之 判别MST唯一性-Kruskal解法(POJ1679)的更多相关文章

  1. ACM/ICPC 之 四道MST-Kruskal解法-练习题(POJ1251-POJ1287-POJ2031-POJ2421)

    由于题目简单,部分题意写在代码中(简单题就应该多练英文...),且较少给注释,需要注意的地方会写在代码中,虽然四个题意各有千秋,但万变不离其宗,细细思考一番会发现四道题都属于很直接的最小生成树问题,由 ...

  2. ACM/ICPC 之 Kruskal范例(ZOJ1203-POJ1861(ZOJ1542))

    两道最小生成树范例,Kruskal解法-以边为主体扩展最小生成树,需要利用并查集. ZOJ1203-Swordfish 题意:求n个给定平面坐标的城市中的一条平面距离上的最短路长(保留两位小数) 题解 ...

  3. ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))

    两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...

  4. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

  5. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  6. 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  7. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  8. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  9. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

随机推荐

  1. 正则表达式基础---转自 Python正则表达式指南 前边

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  2. 详细解读PHP时区修改正确方法

    .修改PHP.ini这个文件 找到date.timezone这行,去掉前面的分号,改成: date.timezone = Asia/Shanghai .修改 .htaccess文件 修改.htacce ...

  3. ASP CDONTS.NEWMAIL组件发送电邮(附下载)

    附CDONT.NEWMAIL组件下载地址:http://files.cnblogs.com/files/colinliu/cdonts.rar ASP常规发送方法: <% dim mail se ...

  4. 湖南附中模拟day1 收银员

    4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...

  5. C语言:break和continue

    break: break用于循环则是终止循环,break如果用于switch,则是用于终止switch.break不能直接用于if,除非if是属于循环内部的一个子句 ;i<;i++) { > ...

  6. POJ 3744 Scout YYF I

    分段的概率DP+矩阵快速幂                        Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  7. 微信要革"传统电视"的命吗?

    除夕夜不知大家是否发现微信摇一摇界面下方的菜单变成4个了?“红包,人,歌曲,电视”,红包和电视是新增的,几天之后红包这个菜单消失了,电视菜单还在,能够摇出一些电视台的直播节目单,以往的摇电视借用的是摇 ...

  8. 微信连wifi正式全量对外开放申请 升级智能服务

    之前我们提到过微信公众平台"微信连Wi-Fi"功能来了,昨日,微信连Wi-Fi自助申请入口正式全量对外开放(独立申请入口https://wifi.weixin.qq.com/),意 ...

  9. 牡丹江.2014k(构造)

    K - Known Notation Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Su ...

  10. Apache常用2种工作模式prefork和worker比较

    Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...