题意:
给定连接的无向图,告诉它的最小生成树是否唯一。
定义1(生成树):考虑连通的无向图G =(V,E)。G的生成树是G的子图,比如T =(V’,E’),具有以下属性:
1.V’= V.
2.T是连通的和非循环的。
定义2(最小生成树):考虑边加权,连通,无向图G =(V,E)。G的最小生成树T =(V,E’)是总成本最小的生成树。T的总成本是指E’中所有边缘的权重之和。

Input:
第一行包含单个整数t(1 <= t <= 20),即测试用例的数量。每个案例代表一个图表。它以包含两个整数n和m(1 <= n <= 100),节点数和边数的行开始。以下m行中的每一行包含三元组(xi,yi,wi),表示xi和yi通过权重= wi的边连接。对于任何两个节点,最多只有一个边连接它们。

Output:
对于每个输入,如果MST是唯一的,则打印它的总成本,否则打印字符串’Not Unique!’。

思路:

  • Kruskal求最小生成树的值+记录边
  • 对每条边,判断去掉这条边后是否能够构成值相同的最小生成树

参考:

  • Kruskal:
    https://blog.csdn.net/Albert_Bolt/article/details/82253141
    https://www.iteye.com/blog/hefeijack-1901181
  • Prim:
    好的代码及思路讲解
    https://www.cnblogs.com/kuangbin/p/3147329.html

Kruskal:

#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 110;struct EDGE
{int u, v, w;
};
bool cmp(EDGE a, EDGE b)
{return a.w < b.w;
}int n, m;
EDGE edge[maxn * maxn];
int par[maxn];
int path[maxn];int find(int x)
{if (par[x] == x)return par[x];return par[x] = find(par[x]);
}void initialize()
{for (int i = 0; i <= n; i++)//要有=啊!不然就错了,所以以后直接i<maxn,干脆全部初始化了算了par[i] = i;
}int main()
{int T; cin >> T;while (T--){cin >> n >> m;for (int i = 0; i < m; i++)cin >> edge[i].u >> edge[i].v >> edge[i].w;initialize();sort(edge, edge + m, cmp);int cnt = 0;//记录路径时候用int ans = 0;//保存最小生成树的结果for (int i = 0; i < m; i++){int fa = find(edge[i].u);int fb = find(edge[i].v);if (fa != fb){par[fb] = fa;ans += edge[i].w;path[cnt++] = i;}}int flag = 1;//去掉已经得到的最小生成树的每一条边,再次计算最小生成树,//随后求值,如果删除一条之后,所得值和之前相等,则说明最小生成树不唯一for (int ii = 0; ii < cnt; ii++){initialize();int sum = 0;//用来求后来的最小生成树的值int edge_cnt = 0;//判断能否构成最小生成树for (int i = 0; i < m; i++){if (i == path[ii])continue;//如果是要删去的这条边,则跳过int fa = find(edge[i].u);int fb = find(edge[i].v);if (fa != fb){par[fb] = fa;sum += edge[i].w;edge_cnt++;}}//cout << sum << " ";if (edge_cnt == n - 1 && sum == ans){//cout << "Not Unique!" << endl;flag = 0;//break;}}if (flag)::cout << ans << endl;else::cout << "Not Unique!" << endl;}return 0;
}

poj 1679 TheUniqueMST 最小生成树Kruskal(、Prim待做相关推荐

  1. poj 1287 Networking 最小生成树 Kruskal Prim

    关于Kruskal和Prim在前面已经有详细的解释以及模板了 有关于需要注意的地方,以及在代码中注释出来. //Kruskal //用结构体保存起始点以及耗费,然后排序后,根据Kruskal #inc ...

  2. poj 3026 BorgMaze 最小生成树Kruskal、Prim(Prim VS报错待解决

    题意 以及 思路: 从S点有一伙人出发去消灭A点的敌人,在S点或者A点可以分裂成几个小队然后分别走,这样路径=总队路径+各个小队路径 问你怎样路径最短. 在一个y行 x列的迷宫中,有可行走的通路空格' ...

  3. * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法

    文章目录 Kruskal算法 模板:https://blog.csdn.net/Rain722/article/details/65642992 Prim算法 模板: poj 1251 JungleR ...

  4. poj 2439 ArcticNetwork 最小生成树Kruskal、(Prim方法还没做

    题意思路: https://www.cnblogs.com/yueshuqiao/archive/2011/08/24/2152471.html Kruskal: 参考大佬的代码: 法一 法二 #pr ...

  5. poj 1789 TruckHistory 最小生成树 Kruskal、Prim

    题意: n个车牌号,刚开始只有一个车牌,其他车牌都是由一个车牌直接或间接产生,一个车牌到另一个车牌的产生权值是它们之间的数字不同的个数,问产生的最小的边权和,即求最小生成树. Input: 多组数据. ...

  6. poj 1751 Highways 最小生成树Kruskal(、Prim还没写

    OJ交不了,,, #pragma warning(disable:4996) #include<iostream> #include<string> #include<c ...

  7. poj 1679 判断最小生成树是否唯一

    /* 只需判断等效边和必选边的个数和n-1的关系即可 */ #include<stdio.h> #include<stdlib.h> #define N 110 struct ...

  8. #最小生成树,prim,kruskal#poj 2560 Freckles 雀斑

    题目 求最小生成树 分析 prim & kruskal Kruskal代码 #include <cstdio> #include <cmath> #include &l ...

  9. ReviewForJob——最小生成树(prim + kruskal)源码实现和分析

    [0]README 1)本文旨在给出 ReviewForJob--最小生成树(prim + kruskal)源码实现和分析, 还会对其用到的 技术 做介绍: 2)最小生成树是对无向图而言的:一个无向图 ...

最新文章

  1. 3.3 目标检测-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  2. Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题
  3. 使用wss和HTTPS / TLS保护WebSocket的安全
  4. 漫画 | 面试的我 VS 真实的我
  5. 小白打基础一定要吃透的11类 Python 内置函数
  6. Leetcode之Non-decreasing Array 问题
  7. 抖音引流必须知道的三个要点!!!!
  8. 利用PHPExcel将数据导出到xls格式的excel文件
  9. WPTools改进了光标定位算法和RTF编写器
  10. 1.3 网页数据抓取
  11. 包围曝光(Bracket Exposure)
  12. JAVA保存数据库前验证字符串长度
  13. 【愚公系列】2022年08月 微信小程序-左划删除效果实现
  14. 计算机应用基础徐海英教案,计算机应用基础教参徐海英双色版….doc
  15. 没有赛博空间学的“元宇宙”就是扯淡
  16. 南京理工大学计算机学硕考研人数,2017年南京理工大学考研报录比
  17. 【王道思维扩展1】求解斐波那契数列的递归和非递归算法,并分析两种时间复杂度
  18. 如何使用STM32F10x驱动MLX90640模块(移植官方驱动)
  19. 【linux基础】22、iptables layer7 实现七层应用过滤
  20. IOS开发之——画板-清屏/撤销/橡皮擦/保存(88)

热门文章

  1. Thinkphp3.2版本Controller和Action的访问方法
  2. Linux系统目录结构以及简单说明
  3. D. The Door Problem 带权并查集
  4. Hibernate映射关系之多对多
  5. c语言115写成16进制,西安电子科技大学计算机导论与C语言程序设计 计算机文化概论.pdf...
  6. Java面向对象——基础2 封装、继承、多态
  7. C雨涵课后习题(18)
  8. 复习:线性表——顺序表
  9. 国产数据库发展十策(三):是走MySQL路线还是PostgreSQL路线?
  10. 活动预告丨openGauss西安Meetup来啦!本周五见!