题意:
     判断最小树是否唯一。
思路:

     我用了两种方法,主要就是好久没敲了,找个水题练练手,第一种就是先一遍最小生成树,然后枚举最小生成树上的每一条边,然后取消这条边,在跑一遍最小生成树,就这样一直跑最小生成树,如果找到了一颗和之前的那个一样的,那么就是不唯一,第二种方法也是先最小树,然后枚举,在枚举的时候不是继续重新跑,而是断开当前边,把树分成两个集合<两次深搜实现>,然后在枚举这连个集合之间是否可以找到一个可以代替当前枚举的最小树的边,实现复杂度的话应该是第二种快点,但理论上也快不多少,只是为了练练手,在多说一句,第二种方法和求次小树的思路有点像,但是次小树可以再这个上面进行dp优化,其实这个题目也可以直接判断次小树是否等于最小树。好像有点说多了。


#include<stdio.h>
#include<string.h>
#include<algorithm>#define N 110using namespace std;typedef struct
{int x ,y ,c;
}EDGE;typedef struct
{int to ,next;
}STAR;EDGE edge[N*N];
STAR E[N*N];
int  map[N][N] ,mer[N] ,mark[N];
int list[N] ,tot ,mst[N];
int L[N] ,R[N] ,ll ,rr;void add(int a, int b)
{E[++tot].to = b;E[tot].next = list[a];list[a] = tot;
}int finds(int x)
{return x == mer[x] ? x : mer[x] = finds(mer[x]);
}int minn(int x ,int y)
{return x < y ? x : y;
}bool camp(EDGE a ,EDGE b)
{return a.c < b.c;
}int MST(int n ,int m)
{for(int i = 1 ;i <= n ;i ++) mer[i] = i;int Ans = 0 ,sum = 0;memset(list ,0 ,sizeof(list)) ,tot = 1;for(int i = 1 ;i <= m ;i ++){int xx = finds(edge[i].x);int yy = finds(edge[i].y);if(xx != yy) {Ans += edge[i].c ,sum ++;mer[xx] = yy;mst[sum] = i;add(edge[i].x ,edge[i].y);add(edge[i].y ,edge[i].x);}if(sum == n - 1) break;}return Ans;
}void DFS1(int x)
{for(int k = list[x] ;k ;k = E[k].next){int to = E[k].to;if(mark[to]) continue;mark[to] = 1;L[++ll] = to;DFS1(to);}
}void DFS2(int x)
{for(int k = list[x] ;k ;k = E[k].next){int to = E[k].to;if(mark[to]) continue;mark[to] = 1;R[++rr] = to;DFS2(to);}
}int main ()
{int t ,n ,m ,i ,j ,mk;scanf("%d" ,&t);while(t--){scanf("%d %d" ,&n ,&m);for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= n ;j ++)map[i][j] = 100000000;for(i = 1 ;i <= m ;i ++){scanf("%d %d %d" ,&edge[i].x ,&edge[i].y ,&edge[i].c); int x = edge[i].x ,y = edge[i].y;map[x][y] = map[y][x] = minn(map[x][y] ,edge[i].c);}sort(edge + 1 ,edge + m + 1 ,camp);int Ans = MST(n ,m);if(m == n - 1){printf("%d\n" ,Ans);continue;}mk = 0;for(i = 1 ;i < n && !mk;i ++){memset(mark ,0 ,sizeof(mark));int l = edge[mst[i]].x ,r = edge[mst[i]].y;mark[l] = mark[r] = 1;ll = rr = 0;L[++ll] = l ,R[++rr] = r;    DFS1(l) ,DFS2(r);for(int j = 1 ;j <= ll && !mk;j ++){for(int k = 1 ;k <= rr && !mk ;k ++){if(L[j] == edge[mst[i]].x && R[k] == edge[mst[i]].y || L[j] == edge[mst[i]].y && R[k] == edge[mst[i]].x)continue;if(map[L[j]][R[k]] == edge[mst[i]].c) mk = 1;}}}mk ? printf("Not Unique!\n"): printf("%d\n" ,Ans);}return 0;
}

POJ 1679 判断最小树是否唯一相关推荐

  1. poj 1679 判断最小生成树是否唯一

    /* 只需判断等效边和必选边的个数和n-1的关系即可 */ #include<stdio.h> #include<stdlib.h> #define N 110 struct ...

  2. POJ 1679 The Unique MST(次小生成树)

    求次小生成树的两种方法. 第一种:Kruskal算法比较好操作.先求一遍最小生成树,然后再记录最小生成树上的边.然后再枚举删去最小生成树上的边,再求最小生成树,如果求出的最小生成树的花费等于第一次最小 ...

  3. POJ 1679 解题报告

    这道题是判断最小生成树是否唯一. 方法之一(也是显而易见正确的方法)是求次小生成树,然后看两者的值是否一样.一样则不唯一.ByVoid有对次小生成树(及次短路径)的讲解(https://www.byv ...

  4. poj 1679 The Unique MST

    题目连接 http://poj.org/problem?id=1679 The Unique MST Description Given a connected undirected graph, t ...

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

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

  6. 网络营销——网站权重并不是判断网站营销水平的唯一标准

    在网站优化行业中,没有一个优化师不关心网站权重的增减,网站权重的变化在一定程度上呈现出网站优化效果的好坏,往往词库上千或者几个词库的网站都能拥有权3.权4的水平,但这样的网站就一定好吗?网站权重就是评 ...

  7. POJ 1679 - The Unique MST(次小生成树)

    题目链接 https://vjudge.net/problem/POJ-1679 Given a connected undirected graph, tell if its minimum spa ...

  8. poj 1679 TheUniqueMST 最小生成树Kruskal(、Prim待做

    题意: 给定连接的无向图,告诉它的最小生成树是否唯一. 定义1(生成树):考虑连通的无向图G =(V,E).G的生成树是G的子图,比如T =(V',E'),具有以下属性: 1.V'= V. 2.T是连 ...

  9. Segments POJ - 3304(判断直线知否经过所有线段)

    Segments POJ - 3304 题意:给n个线段的端点,问你将这些线段都投影到同一条直线上是否所有的线段都有交点. 思路:如果可以有一条直线可以穿过所有的线段的话那么就存在题意中的直线. #i ...

最新文章

  1. 即将到来的金三银四,这10道springboot常见面试题你需要了解下
  2. Highmaps网页图表教程之下载Highmaps与Highmaps的地图类型
  3. Windows CE 程序设计 (3rd 版)
  4. 卷积神经网络只是一种全连接神经网络的特殊情况
  5. GARFIELD@04-14-2005
  6. linuc和python常用命令是一样的么_Linux常用命令大全(非常全!!!)(2)|简明python教程|python入门|python教程...
  7. 安装好机器学习环境的虚拟机_虚拟环境之外的数据科学是弄乱机器的好方法
  8. python交互式绘图比较_python – 基于Tkinter和matplotlib的交互式绘图
  9. scala学习-scala中的特殊符号使用
  10. Netty工作笔记0071---Protobuf传输多种类型
  11. AudioUnitRender -10876
  12. Spring 之autowired
  13. Unity3d 镜面反射 vertex and frag Shader源代码
  14. Dubbo/ Spring Cloud 分布式事务管理 LCN方式
  15. 计算机系统文字图片以啥子存在,电脑如何识别图片中文字的字体|电脑通过图片识别字体的方法...
  16. 前后端分离微服务管理系统项目实战SaaS-HRM项目(一)——系统概述与环境搭建
  17. 【VBA】Excel 密码管理器
  18. 普通二维码跳转微信小程序
  19. 大学计算机基础案例教程章测试答案,大学计算机基础案例教程--Win7+Office2010(高等院校公共基础课规划教材)...
  20. java的time_Java TimeUnit使用

热门文章

  1. JavaScript事件详解-jQuery的事件实现(三)
  2. Ampzz 2011 Cross Spider 计算几何
  3. OPatch cannot find a valid oraInst.loc file to locate Central Inventory
  4. 转:Linux下应用tgtadm构建iSCSI Target(SAN)
  5. 黑马lavarel教程---13、分页
  6. 8. American Friendship 美国式的友谊
  7. 《架构漫谈》阅读笔记
  8. 如何将四个一字节的数转换为一个四字节数
  9. 与html相关的知识点整理
  10. 使用Git进行代码管理的心得