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)
上一篇 2022年1月27日 下午6:00
下一篇 2022年1月27日 下午6:00


相关推荐

  • java跟python优势_当前Java与Python相比还有哪些优势「建议收藏」

    java跟python优势_当前Java与Python相比还有哪些优势「建议收藏」首先,Java语言与Python语言都是非常流行的全场景编程语言,在很多开发场景下,既可以使用Java语言,也可以采用Python语言,比如Web开发、大数据开发等等。随着近几年大数据和人工智能领域的热度越来越高,Python语言的上升趋势还是比较明显的。采用Python构建的分析系统虽然Python语言得到了越来越多的关注,但是Java语言还是有很多固有优势的,主要体现在以下三个方面:第一:性能…

    2026年4月17日
    3
  • 我把6个天马行空的想法扔给Seedream 4.0,它的表现出乎意料…

    我把6个天马行空的想法扔给Seedream 4.0,它的表现出乎意料…

    2026年3月12日
    2
  • navicat15最新激活码_通用破解码「建议收藏」

    navicat15最新激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    307
  • 极路由饥饿营销引质疑 联合创始人拿数据正面回应

    极路由饥饿营销引质疑 联合创始人拿数据正面回应极路由饥饿营销引质疑联合创始人拿数据正面回应腾讯科技 微博 宗秀倩 2013 年 11 月 07 日 09 06 微博空间微信新浪微博邮箱好友人人网开心网 导读 今年极路由一路从发布第一代工程机到现在 作为创业公司 一路险象环生 在第二代产品发布之后 极路由的未来之路也非坦途 依然有诸多考验 转播到

    2026年3月17日
    2
  • idea激活码mac【在线注册码/序列号/破解码】

    idea激活码mac【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    56
  • 程序员写个人技术博客的价值与意义

    程序员写个人技术博客的价值与意义文章目录什么是博客主要用途博客分类个人博客使用第三方平台个人博客与独立博客的优缺点使用第三方平台个人博客的优点独立博客的优点没写博客的原因浪费时间工作太忙,没时间写懒于思考,疏于总结怕自己的技术被别人学到,被别人超越想写,但不知道写什么技术含量低,写出来没意义,怕别人嘲笑写博客最初的想法写博客的价值与意义加深对技术点的理解,记录足迹,反映成长,分类检索,方便日后查阅观点碰撞,分享收获结交更多志同道…

    2022年5月20日
    39

发表回复

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

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