求次小生成树思路: 先把最小生成树求出来  用一个Max[i][j] 数组把  i点到j 点的道路中 权值最大的那个记录下来 used数组记录该条边有没有被最小生成树使用过   把没有使用过的一条边加入最小生成树必然回形成一条回路   在这条回路中减去 除加入的边的权值最大的一条边  原图必然保持连通  (如果此时 权值最大的边和新加入的边权值相同  则存在 不同的最小生成树) 把每一条边加入再删除后 即可得出次小生成树

参考了: https://blog.csdn.net/qq_33951440/article/details/53084248

     https://blog.csdn.net/li1615882553/article/details/80011884

     https://www.cnblogs.com/kuangbin/p/3147329.html

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include<vector>
  5. #include<iostream>
  6. #include<cstring>
  7. int ans;
  8. const int maxn=+;
  9. const int INF=;
  10. int x[maxn],y[maxn];
  11. int cost[maxn][maxn];
  12. int pre[maxn];
  13. int lowc[maxn];
  14. int Max[maxn][maxn];
  15. int vis[maxn];
  16. int parent[maxn];
  17. int used[maxn][maxn];
  18. using namespace std;
  19. int prim(int cost[][maxn],int n){
  20. int ans=;
  21. memset(vis,false,sizeof(vis));
  22. memset(Max,,sizeof(Max));
  23. memset(used,false,sizeof(used));
  24. vis[]=;
  25. pre[]=-;
  26. for(int i=;i<n;i++){
  27. lowc[i]=cost[][i];//刚开始只有v0在生成树中 生成树和不在生成树的距离 就是v0和 其他点的距离
  28. pre[i]=;
  29. }
  30. for(int i=;i<n;i++){
  31. int minc=INF;
  32. int p=-;
  33. for(int j=;j<n;j++){
  34. if(!vis[j]&&minc>lowc[j]){//找出到树最短的变
  35. minc=lowc[j];
  36. p=j;
  37. }
  38. }
  39. if(p==-)return -; //不连通
  40. ans+=minc;
  41. vis[p]=;
  42. used[p][pre[p]]=used[pre[p]][p]=; //该边设置为已使用
  43. for(int j=;j<n;j++){
  44. if(vis[j])Max[j][p]=Max[p][j]=max(Max[j][pre[p]],minc);//更新 j到p 的最大权值的边
  45. if(!vis[j]&&lowc[j]>cost[p][j]){
  46. lowc[j]=cost[p][j]; //更新树到点的最短距离
  47. pre[j]=p;//j点如果要进树 连p点 所以p就是j的父结点
  48. }
  49. }
  50. }
  51. return ans;
  52.  
  53. }
  54.  
  55. int smst(int cost[][maxn],int n){ //计算是否可以删除一条边 仍得到所有边权值不变
  56. int minnum=INF;
  57. for(int i=;i<n;i++){
  58. for(int j=i+;j<n;j++){
  59. if(cost[i][j]!=INF&&!used[i][j]){
  60. minnum=min(minnum,ans+cost[i][j]-Max[i][j]);
  61. }
  62.  
  63. }
  64. }
  65. return minnum;
  66. }
  67.  
  68. int main()
  69. {
  70. int t;
  71. cin>>t;
  72. while(t--){
  73. int n,m;
  74. scanf("%d%d",&n,&m);
  75. int u,v,w;
  76. for(int i=;i<n;i++){
  77. for(int j=;j<n;j++){
  78. if(i==j)cost[i][j]=;
  79. else cost[i][j]=INF;
  80. }
  81. }
  82. while(m--){
  83. int u,v,w;
  84. scanf("%d%d%d",&u,&v,&w);
  85. u--,v--;
  86. cost[u][v]=cost[v][u]=w;
  87. }
  88. ans=prim(cost,n);
  89. if(ans==smst(cost,n)){
  90. printf("Not Unique!\n");
  91. }
  92. else printf("%d\n",ans);
  93.  
  94. }
  95. return ;
  96. }

The Unique MST POJ - 1679 次小生成树prim的更多相关文章

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

    Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...

  2. Day5 - G - The Unique MST POJ - 1679

    Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...

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

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

  4. poj1679 The Unique MST(判定次小生成树)

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

  5. poj 1679 次小生成树

    次小生成树的求法: 1.Prime法 定义一个二维数组F[i][j]表示点i到点j在最小生成树中的路径上的最大权值.有个知识就是将一条不在最小生成树中的边Edge加入最小生成树时,树中要去掉的边就是E ...

  6. K - The Unique MST - poj 1679

    题目的意思已经说明了一切,次小生成树... ****************************************************************************** ...

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

    链接: http://poj.org/problem?id=1679 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82831#probl ...

  8. The Unique MST POJ - 1679 最小生成树判重

    题意:求一个无向图的最小生成树,如果有多个最优解,输出"Not Unique!" 题解: 考虑kruskal碰到权值相同的边: 假设点3通过边(1,3)连入当前所维护的并查集s. ...

  9. UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解

    思路: Prim: 这道题目中有重边 Prim可以先加一个sec数组来保存重边的次小边,这样不会影响到最小生成树,在算次小生成树时要同时判断次小边(不需判断是否在MST中) Kruskal: Krus ...

随机推荐

  1. IIS配置Url重写实现http自动跳转https的重定向方法(100%解决)

    引言 本文推荐阅读地址:https://www.52abp.com/BlogDetails/10008 这种文章网上可以说一搜一大把,但是我为什么还要写呢,因为一搜一把没把我气死,都是东抄西挪的东西, ...

  2. vue开发中regeneratorRuntime is not defined

    我的项目是用vue提供的vue-cil脚手架生成的项目,但是当我在项目中使用async/await,编译代码的的时候报了regeneratorRuntime is not defined的错,我查过资 ...

  3. AQS解析(未完成)

    参考:Java并发之AQS详解 同步队列和condition等待队列.获取到锁的线程则处于可运行状态,而未获取到锁的线程则被添加到同步队列中,等待获取到锁的线程释放锁. 一.数据结构 Node sta ...

  4. jmeter之批量修改请求路径

    今天工作时碰到一个问题:测试环境中由于tomcat没指定webapps下的文件夹名,导致tomcat使用了webapps下默认的文件夹名,而我的jmeter脚本都已经做出来了,一共83个接口,挨个改路 ...

  5. js中的一些方法

    数组 //map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. 返回值:一个新数组,每个元素都是回调函数的结果. var array1 = [1, 4, 9, ...

  6. Jmeter之Constant Timer与constant throughput timer的区别(转)

    当放置Constant Timer于两个http请求之间,那么它代表的含义是:在上一个请求发出至完成后, 开始Contant Timer指定的时间,最后再发出第二个请求.它并不是代表两个请求之间的发送 ...

  7. vue单页面模板说明文档(3)

    Environment Variables Sometimes it is practical to have different config values according to the env ...

  8. laravel创建项目

    composer create-project --prefer-dist laravel/laravel=5.5.* blog

  9. 123. 单词搜索(DFS)

    描述 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词. 单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻.每个单元中的字母最多只能使用一次. 样例 给出 ...

  10. mybatis一级缓存详解

    mybatis缓存分为一级缓存,二级缓存和自定义缓存.本文重点讲解一级缓存 一:前言 在介绍缓存之前,先了解下mybatis的几个核心概念: * SqlSession:代表和数据库的一次会话,向用户提 ...