题意:判断最小生成树是否唯一,如果唯一则是输出最小长度;否则输出 Not Unique!
其中:枚举每条不在最小生成树上的边,并把这条边放到最小生成树上面,然后就一定形成环,那么我们将这条环中取出最长的一条路。最终我们得到的权值便是最小生成树的权值。
Max[i][j]表示的最小生成树中的点i到点j之间的最长距离。Max[u][j]=max(Max[j][p[u]],dist[u])

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn=505;
const int inf=0x3f3f3f3f;
int p[maxn];
int cost[maxn][maxn];
int dist[maxn];
int vis[maxn];
int Max[maxn][maxn];
int used[maxn][maxn];
int n,m;
int Prim(){memset(vis,0,sizeof(vis));memset(p,0,sizeof(p));memset(Max,0,sizeof(Max));memset(used,0,sizeof(used));int mincost=0;p[1]=-1;for(int i=2;i<=n;i++){dist[i]=cost[1][i];p[i]=1;}dist[1]=0;vis[1]=1;for(int i=2;i<=n;i++){int temp=inf;int t=-1;for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]<temp){temp=dist[j];t=j;}}if(temp==inf)return -1;mincost+=dist[t];vis[t]=1;used[t][p[t]]=used[p[t]][t]=1;//记录最小生成树之间相连的两点 Max[t][p[t]]=Max[p[t]][t]=temp;for(int j=1;j<=n;j++){if(vis[j]&&j!=t){Max[j][t]=Max[t][j]=max(Max[j][p[t]],dist[t]);//记录最小生成树之间的次短路路径长度 }if(cost[t][j]<inf){if(!vis[j]&&dist[j]>cost[t][j]){dist[j]=cost[t][j];p[j]=t;}}}}return mincost;
}
//枚举出所有不属于最小生成树的边(u,v),并且用w(u,v)来替代最大权值和Max(u,v)
int second_prim(int minst){int ans=inf;for(int i=1;i<=n;i++){for(int j=1+i;j<=n;j++){if(!used[i][j]&&cost[i][j]!=inf){ans=min(ans,minst+cost[i][j]-Max[i][j]);}}}if(ans==inf)return -1;return ans;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){dist[i]=inf;for(int j=1;j<=n;j++){if(i==j){cost[i][j]=0;}else{cost[i][j]=inf;} }}for(int i=1;i<=m;i++){int a,b,dists;scanf("%d %d %d",&a,&b,&dists);cost[a][b]=cost[b][a]=dists;}int Minst=0;Minst=Prim();if(Minst==-1){cout<<"Not Unique!"<<endl;continue;}int second_min=second_prim(Minst);if(second_min==Minst){cout<<"Not Unique!"<<endl;}else{cout<<Minst<<endl;}  }return 0;
}

poj1679(次小生成树)相关推荐

  1. 次小生成树(POJ1679/CDOJ1959)

    POJ1679 首先求出最小生成树,记录权值之和为MinST.然后枚举添加边(u,v),加上后必形成一个环,找到环上非(u,v)边的权值最大的边,把它删除,计算当前生成树的权值之和,取所有枚举加边后生 ...

  2. POJ1679 Luogu4180 次小生成树

    The Unique MST Given a connected undirected graph, tell if its minimum spanning tree is unique. Defi ...

  3. 【POJ1679】The Unique MST(非严格次小生成树)

    problem 给出一个连通无向图,判断它的最小生成树是否唯一 如果唯一,输出生成树的大小,否则输出"Not Unique!" solution 直接求非严格次小生成树 如果次小生 ...

  4. (POJ-1679)次小生成树模板

    原题链接:http://poj.org/problem?id=1679 The Unique MST Given a connected undirected graph, tell if its m ...

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

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

  6. poj 1679 次小生成树

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

  7. HDU4081(次小生成树)

    1.其中:枚举每条不在最小生成树上的边,并把这条边放到最小生成树上面,然后就一定形成环,那么我们将这条环中取出最长的一条路.最终我们得到的权值便是最小生成树的权值. Max[i][j]表示的最小生成树 ...

  8. 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)

    整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...

  9. 解题报告:luogu P4180 [BJWC2010]严格次小生成树(次小生成树、倍增LCA优化、O(mlogn) )

    P4180 [BJWC2010]严格次小生成树 次小生成树有两种,一种是不严格次小生成树,也就是可以数值上等于最小生成树,一种是严格次小生成树,是权值严格大于最小生成树,两种求法大同小异. 方法2在严 ...

  10. 最小生成树(kruskal、prim、最小生成森林问题、严格次小生成树)

    整理的算法模板合集: ACM模板 目录 一.kruskal算法 二.prim算法 三.Boruvka算法 四.生成森林问题(K颗树) 五.最小生成树的唯一性 六.严格次小生成树 LCA优化的次小生成树 ...

最新文章

  1. 范数介绍及C++/OpenCV/Eigen的三种实现
  2. Horizon Is Easy, Horizon Is Complex
  3. 手机吸费软件肆意捞金,通过代码签名证书加以防范
  4. python 字符串转字典,字典转字符串 Expecting property name enclosed in double quotes
  5. Educational Codeforces Round 56 Editorial
  6. NYOJ 595 乱七八糟
  7. Android 服务器推送技术
  8. html 怎么置顶表格,表格(Table)表头固定,内容上滚【5个实例】
  9. 2021年吉林高考成绩怎么查询,2021年吉林高考成绩查询登录网址入口怎么查 附查询方法...
  10. 大会预告 | 第一届中国情感计算大会
  11. Fiddler详解-Fiddler Classic
  12. 获取自身进程结构和csrss.exe进程结构 explorer.exe进程结构
  13. 《测绘综合能力》——摄影测量与遥感
  14. swift 数组遍历 forEach 、enumerated、iterator、indices
  15. 《谷物大脑》书中的精髓:如何通过四星期行动计划打造健康身体?
  16. damon ps2 android,DamonPS2模拟器
  17. 计算机策略编辑器,组策略及组策略编辑器基础知识
  18. 您可能不知道WooCommerce可以做的10件事
  19. 【php】empty()详解
  20. 35岁后最可怕的事,就是成为职场中的奢侈品

热门文章

  1. Vue之概述、基本使用、data数据和if条件渲染
  2. 王爽 汇编语言第三版 监测点9.2 监测点9.3 补全编程,利用jcxz指令,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,
  3. 2007年上半年 网络工程师 上下午试卷【附带答案】
  4. 写论文神器APEX-NET:自动重新绘制图像
  5. 基于OpenCV的直方图匹配
  6. linux系统资源监控
  7. laravel 如何自定义全局的方法/类
  8. [Math]理解卡尔曼滤波器 (Understanding Kalman Filter)
  9. 【JavaScript】AJAX教程
  10. Qt 小技巧之“To-Do 事项”