POJ 1679:The Unique MST(次小生成树&&Kruskal)[通俗易懂]

POJ 1679:The Unique MST(次小生成树&&Kruskal)

大家好,又见面了,我是全栈君。


Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 19941   Accepted: 6999

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 <= t <= 20), the number of test cases. Each case represents a graph. It begins with a line containing two integers n and m (1 <= n <= 100), the number of nodes and edges. Each of the following m lines contains a 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

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!

这道题就是要你推断是否为唯一的最小生成树。。

这也是我第一道次小生成树的题。。那个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;}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115989.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 汇编语言转换成C语言软件_archlinux

    汇编语言转换成C语言软件_archlinux从ARMv8-A开始出现了64位的ARM指令集:Aarch64。

    2022年10月16日
    0
  • ldd 命令介绍_ldr指令是什么意思

    ldd 命令介绍_ldr指令是什么意思1.在制作自己的发行版时经常需要判断某条命令需要哪些共享库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行;在Linux环境下通过ldd命令即可实现,在终端下执行:ldd/bin/ls//ldd命令通常使用”-v”或”–verbose”选项来显示所依赖的动态连接库的尽可能的详细信息。即可得到/bin/ls命令的相关共享库文件列表:libtermcap.so.2=>/lib/lib

    2022年5月3日
    65
  • 微型计算机原理与接口技术网课_微型计算机原理与接口技术周荷琴

    微型计算机原理与接口技术网课_微型计算机原理与接口技术周荷琴微型计算机组成原理课程内容介绍第一章微型计算机基础第二章80X80微型处理器第三章汇编语言指令集第四章汇编语言程序设计第五章输入/输出系统第六章中断系统第七章微型计算机系统串行通讯第八章并行I/O接口第九章可编程定时/计数器课程意义汇编语言接口技术学习目标本笔记的视频,源自中国大学MOOC,南京邮电大学的微型计算机原理与接口技术。课程内容介绍第一章微型计算机基础这一章将…

    2022年10月2日
    0
  • python删除数组指定元素_python数组中去掉一个元素

    python删除数组指定元素_python数组中去掉一个元素python-删除数组指定元素

    2022年8月11日
    21
  • Netty框架

                          Netty框架概述 Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络IO程序。Netty是一个基于NIO的网络编程框架,使用Netty可以帮助你快速、简单的开发出一个网络应用,相…

    2022年4月6日
    166
  • 蓝墨云班课资源下载不了_蓝墨云班课老师怎么用

    蓝墨云班课资源下载不了_蓝墨云班课老师怎么用看见有人详细讲解了下载文件的原理,在这里我就不赘述了,直接上写好的代码。可能乱了点。有一点要提前说一下,做这个的时候,我想着只下载没有获得经验的文件。已经获得过经验的文件因为我用不到,所以就不用下,当然,改一下代码的话没货的经验的也能下。相关的代码在download_sours函数里面,jy表示的是经验,jy=N代表没获得经验的文件,改一下就行,去掉这个判断条件就能下载已经获得经验的资源了。最后,封装好的软件下载链接在文章最末尾importosimportreimporttimeimpor

    2025年6月25日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号