<题目链接>

题目大意:

给定一张无向图,判断其最小生成树是否唯一。

解题分析:

对图中每条边,扫描其它边,如果存在相同权值的边,则标记该边;用kruskal求出MST。

如果MST中无标记的边,则该MST唯一;否则,在MST中依次去掉标记的边,再求MST,若求得MST权值和原来的MST 权值相同,则MST不唯一。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int M = 1e4+;
struct EDGE{
int u,v,w;
int eq,used,del;
}edge[M];
int n,m;
int father[M];
bool flag;
bool cmp(EDGE a,EDGE b){
return a.w<b.w;
}
int find(int x){
if(father[x]!=x)father[x]=find(father[x]);
return father[x];
}
int Kruscal(){
for(int i=;i<1e4+;i++)father[i]=i;
int sum=,num=;
for(int i=;i<m;i++){
if(edge[i].del)continue;//如果该边被删除,则跳过
int u=edge[i].u,v=edge[i].v,w=edge[i].w;
if(find(u)!=find(v)){
sum+=w,num++;
if(flag)edge[i].used=;//将第一次最小生成树的所有边标记
father[find(v)]=find(u);
}
if(num>=n-)break;
}
return sum;
}
int main(){
int T;scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(edge,,sizeof(edge)); //用memset能给edge内的所有变量初始化吗?
for(int i=;i<m;i++){
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
}
for(int i=;i<m;i++){
for(int j=;j<m;j++){
if(i==j)continue;
if(edge[i].w==edge[j].w)edge[i].eq=;//判断是否有和它权值相同的边
}
}
sort(edge,edge+m,cmp);
flag=true;
int cnt=Kruscal();
flag=false;
bool fp=false;
for(int i=;i<m;i++){
if(edge[i].eq&&edge[i].used){
edge[i].del=;//如果这条边在第一次求的最小生成树中,并且还有与这条边权值相同的边,那么就试着删除这条边,再跑一遍最小生成树,看得到的权值总和是否与第一次的最小生成树相同
int res=Kruscal();
if(res==cnt){
fp=true;
printf("Not Unique!\n");
break;
}
edge[i].del=;
}
}
if(!fp)printf("%d\n",cnt);
}
return ;
}

2018-10-01

POJ-1679 The Unique MST (判断最小生成树的唯一性)的更多相关文章

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

    借用的是Kruskal的并查集,算法中的一点添加和改动. 通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一. 如果不知道这个最小生成树的算法,还是先去 ...

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

    题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total S ...

  3. 【POJ 1679 The Unique MST】最小生成树

    无向连通图(无重边),判断最小生成树是否唯一,若唯一求边权和. 分析生成树的生成过程,只有一个圈内出现权值相同的边才会出现权值和相等但“异构”的生成树.(并不一定是最小生成树) 分析贪心策略求最小生成 ...

  4. POJ 1679 The Unique MST (最小生成树)

    The Unique MST 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/J Description Given a conn ...

  5. POJ 1679 The Unique MST(最小生成树)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  6. POJ 1679 The Unique MST 【最小生成树/次小生成树模板】

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22668   Accepted: 8038 D ...

  7. POJ 1679 The Unique MST 推断最小生成树是否唯一

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22715   Accepted: 8055 D ...

  8. poj 1679 The Unique MST 【次小生成树】【模板】

    题目:poj 1679 The Unique MST 题意:给你一颗树,让你求最小生成树和次小生成树值是否相等. 分析:这个题目关键在于求解次小生成树. 方法是,依次枚举不在最小生成树上的边,然后加入 ...

  9. poj 1679 The Unique MST(唯一的最小生成树)

    http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

随机推荐

  1. 关闭VirtualBox虚拟机的时钟同步

    原文链接:关闭VirtualBox虚拟机的时钟同步 在VirtualBox的虚拟机上默认虚拟机的时间是会和物理机同步的,但可以通过下面的命令来关闭 1. 首先查看虚拟机列表 VBoxManage li ...

  2. Confluence 6 新安装配置数据库字符集编码

    Confluence 和你的数据库必须配置使用相同的字符集. Confluence 使用 UTF-8 字符集编码,所以你的数据库也必须配置为使用 UTF-8 (或者与 UTF-8 相同的编码,例如在 ...

  3. js 获取当前的网址

    http://www.xcx.cc/index.php/home/index/ind?idf=12321var $cur_url=window.location.href; //获取全部的网址var ...

  4. Vuejs的一些总结

    http://blog.csdn.net/xllily_11/article/details/52312044 原文链接:http://mrzhang123.github.io/2016/07/14/ ...

  5. HTML&javaSkcript&CSS&jQuery&ajax(六)

    一.HTML表单 1.<input type="text">定义文本输入的单上输入字段,<form> First name:<br>   < ...

  6. Python列表、元组、字典和集合的区别

    数据结构 是否可变 是否重复 是否有序 定义符号 列表(list) 可变 可重复 有序 [] 元组(tuple) 不可变 可重复 有序 () 字典(dictionary) 可变 可重复 无序 {key ...

  7. selenium+python-文件下载(SendKeys)

    前言 文件下载时候会弹出一个下载选项框,这个弹框是定位不到的,有些元素注定定位不到也没关系,就当没有鼠标,我们可以通过键盘的快捷键完成操作. SendKeys库是专业的处理键盘事件的,所以这里需要用S ...

  8. Ubuntu 更改屏幕分辨率

    安装完Ubuntu后发现分辨率不合适,平时习惯了看小一点的文字,所以搜了一下修改屏幕分辨率的命令,具体操作如下: 1.先用 xrandr 命令查看一下当前系统支持的分辨率 wayde@wayde-Al ...

  9. Python3 zip() 函数

    描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存. 我们可以使用 list() 转换来输出列表. 如果 ...

  10. Spring Boot学习--项目启动时执行指定service的指定方法

    Springboot给我们提供了两种“开机启动”某些方法的方式:ApplicationRunner和CommandLineRunner. 这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方 ...