[kuangbin带你飞]专题六 最小生成树 K - The Unique MST (判断最小生成树是否唯一)

K - The Unique MST

题目链接:https://vjudge.net/contest/66965#problem/K

题目:

给定连接的无向图,告诉它的最小生成树是否唯一。

定义1(生成树):考虑连通的无向图G =(V,E)。 G的生成树是G的子图,比如T =(V‘,E‘),具有以下属性:
    1. V‘= V.
    2.T是连接的和非循环的。

定义2(最小生成树):考虑边加权,连通,无向图G =(V,E)。 G的最小生成树T =(V,E‘)是总成本最小的生成树。 T的总成本是指E‘中所有边缘的权重之和。
输入
    第一行包含单个整数t(1 <= t <= 20),即测试用例的数量。每个案例代表一个图表。它以包含两个整数n和m(1 <= n <= 100),节点数和边数的行开始。以下m行中的每一行包含三元组(xi,yi,wi),表示xi和yi通过权重= wi的边连接。对于任何两个节点,最多只有一个边连接它们。
产量
    对于每个输入,如果MST是唯一的,则打印它的总成本,否则打印字符串‘Not Unique!‘。
样本输入

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

样本输出

3
    Not Unique!

思路:先 算出最小生成树,并用数组记录每一条边,然后枚举去掉这些边 看其是否也能构成最小生成树且值相同。而且 在删边之后,可能图构不成一棵树,要处理一下

//
// Created by hanyu on 2019/8/2.
//
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include<math.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+7;
int father[maxn];
struct Node{
    int u,v,w;
    bool operator<(const Node &other)const{
        return this->w<other.w;
    }
}node[maxn];
int find(int x)
{
    if(x==father[x])
        return x;
    return father[x]=find(father[x]);
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
            scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].w);
        for(int i=0;i<=n;i++)
            father[i]=i;
        sort(node,node+m);
        int write[maxn],cnt=0,ans=0;
        for(int i=0;i<m;i++)
        {
            int uu=find(node[i].u);
            int vv=find(node[i].v);
            if(uu==vv)
                continue;
            else
            {
                father[uu]=vv;
                write[cnt++]=i;//数组记录路径
                ans+=node[i].w;
            }
        }//计算最小生成树
        int flag=1;
        for(int k=0;k<cnt;k++)//删去这cnt条边,再求最小生成树,判断该最小生成树与上面ans是否相同
        {
            for(int kk=0;kk<=n;kk++)
            {
                father[kk]=kk;
            }
            int sum=0,hh=0;
            for(int i=0;i<m;i++)
            {
                if(i==write[k])//该编号和记录的编号相同,则无需处理
                    continue;
                int uuu=find(node[i].u);//求最小生成树
                int vvv=find(node[i].v);
                if(uuu==vvv)
                    continue;
                else
                {
                    father[uuu]=vvv;
                    sum+=node[i].w;
                    hh++;
                }
            }
            if(hh==n-1&&sum==ans)
            {
                flag=0;
                break;
            }
        }
        if(flag)
            printf("%d\n",ans);
        else
            printf("Not Unique!\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Vampire6/p/11288343.html

时间: 2024-12-09 19:29:29

[kuangbin带你飞]专题六 最小生成树 K - The Unique MST (判断最小生成树是否唯一)的相关文章

[kuangbin带你飞]专题六 生成树

A. POJ 1679  The Unique MST 题意:最小生成树是不是唯一的. 思路:参考http://www.cnblogs.com/onlyAzha/p/4793031.html B. HDU 4081  Qin Shi Huang's National Road System 题意:秦始皇想要在城市之间修路.徐福可以用法力帮助他修一条路.秦始皇希望修一条路使得剩下的路需要的花费B最少,而徐福希望这条路所连的两个城市的人口数之和A最大.权衡后他们决定选择A/B的值最大的边来修建. 思

[kuangbin带你飞]专题六 最小生成树

学习最小生成树已经有一段时间了 做一些比较简单的题还算得心应手..花了三天的时间做完了kuangbin的专题 写一个题解出来记录一下(虽然几乎都是模板题) 做完的感想:有很多地方都要注意 n == 1 注意double 的精度问题 poj 1251 模板题 大写字母减去'A'+1即是它的编号 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<m

[kuangbin带你飞]专题六 最小生成树 G - Arctic Network

G - Arctic Network 题目链接:https://vjudge.net/contest/66965#problem/G 题目: 国防部(DND)希望通过无线网络连接几个北部前哨站.在建立网络时将使用两种不同的通信技术:每个前哨站都有一个无线电收发器,一些前哨站还有一个卫星信道.    任何带卫星频道的两个前哨站都可以通过卫星进行通信,无论其位置如何.否则,两个前哨只有当它们之间的距离不超过D时才可以通过无线电进行通信,这取决于收发器的功率.更高的功率产生更高的D但成本更高.由于采购

[kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads

给一个n个点的完全图 再给你m条道路已经修好 问你还需要修多长的路才能让所有村子互通 将给的m个点的路重新加权值为零的边到边集里 然后求最小生成树 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #define cl(a,b) memset(a

[kuangbin带你飞]专题六 最小生成树 J - Borg Maze

J - Borg Maze 题目链接:https://vjudge.net/contest/66965#problem/J 题目: 博格是一个非常强大的种族,它来自银河系的三角洲象限.博格集体是用来描述博格文明群体意识的术语.每个博格人都通过复杂的子空间网络与集体联系,确保每个成员得到持续的监督和指导. 你的任务是帮助博格(是的,真的)通过开发一个程序,帮助博格估计扫描迷宫的最低成本,以便同化隐藏在迷宫中的外星人,在北部,西部,东部和南部移动脚步.棘手的是,搜索的开始是由100多个人组成的.每当

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher :G - Power Strings POJ - 2406(kmp简单循环节)

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher G - Power Strings POJ - 2406 题目: Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of

kuangbin带你飞专题一 简单搜索 题解

目录 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题一 简单搜索 总结:用时2天半终于把这个专题刷完了 对于最基础的dfs bfs 路径打印 状态转移也有了一点自己些微的理解 其实2天半可以压缩到1天半的 主要是自己太懒了...慢慢加油刷bin神的专题呀 从大二下学期开始学算法 一开始就知道这个专题 一开始对于这个专题里的所有问题感觉都好难啊..就直接放弃了 看lrj的书 现在看到这个专题还挺唏嘘的吧 突然觉得思维和想法也不是很难 果然是那个时候心不静&还是储量不够吗

poj 1679 The Unique MST (判断最小生成树是否唯一)

链接:poj 1679 题意:判断最小生成树是否唯一, 若唯一,输出最小权值和,否则,输出  Not Unique! 判断最小生成树是否唯一的思路: 1.对图中的每一条边,扫描其他边,如果存在相同权值的边,则对该边做标记 2.然后用Kruskal算法或Prim算法求MST 3.求得MST后,如果该MST中未包含做了标记的边,即可判断MST唯一: 如果包含做了标记的边,则依次去掉这些边的一条边,再求MST, 如果求得的MST权值和原来的MST的权值一样,即可判断MST不唯一. 个人思路是先求最小生

poj1679The Unique MST判断最小生成树是否唯一以及求次小生成树边权和的讲解

Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22346   Accepted: 7924 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected graph G =