<题目链接>

题目大意:

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

解题分析:

对图中每条边,扫描其它边,如果存在相同权值的边,则标记该边;用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. Confluence 6 使用 JConsole 监控远程 Confluence

    针对生产系统中,我们推荐你使用远程监控,这个将不会消耗你远程 Confluence 服务器的资源. 启动远程监控: 添加下面的属性到 setenv.sh / setenv.bat 文件中,端口你可以定 ...

  2. 整合 JIRA 和 Confluence 6

    Jira 应用和 Confluence 可以完全的整合在一起.在 Confluence 中收集你项目组成员的想法,知识和计划.在 Jira 中跟踪你的系统出现的问题,让这 2 个应用同时工作. 了解更 ...

  3. JavaScript(JS)之简单介绍

    一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) N ...

  4. tp3.2 事务

    public function exchangeTransfer($user_id, $type, $money, $config, $other_id = 0) { $r['code'] = ERR ...

  5. 如何编辑PDF文件,怎么使用PDF裁剪页面工具

    在编辑PDF文件的时候,往往会有很多的小技巧可以使用,在编辑PDF文件的时候,怎么对文件的页面进行裁剪呢,不会的话,看看下面的文章吧,小编已经为大家整理好了哦. 1.打开运行PDF编辑器,在编辑器中打 ...

  6. 实习笔记 burpsuite

    1.通过设置拦截HTTPS协议消息: 拦截HTTPS协议消息,HTTPS在原有的基础上增加了安全套接字层SSL协议,通过CA证书来验证服务器的身份,在拦截设置中,绑定端口有三种模式,分别是仅本地回路模 ...

  7. Dig skipfish proxystrike

    1.DNS域名信息收集,(Dig,挖掘局域网的信息之前的博客中已经做过介绍) 查询需要认证的域名服务器  dig -t ns    +   网址 使用工具 fierce 判断主机上存活的其他域名服务器 ...

  8. java----String解析

    String在内存中的分析: public class Demo { public static void main(String[] args){ String a = new String(&qu ...

  9. 课外知识----base64加密

    每3个字符产生4位的base64字符,不足3个字符,将用“=”补齐至4位base64字符 例如 00--->  MDA= 000--->MDAw base64加密特点 加密后的字符数是4的 ...

  10. linux 将自己的服务添加到系统service服务

    前言 我们在linux上要启动一个程序得时候, 往往都是要写一堆路径, 找到要启动得服务程序, 再用 ./*** 启动服务. 那么我们有没有快速启动方法吗, 答案是肯定得 service 介绍 官方介 ...