<题目链接>

题目大意:

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

解题分析:

对图中每条边,扫描其它边,如果存在相同权值的边,则标记该边;用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

最新文章

  1. 参考bootstrap中的popover.js的css画消息弹框
  2. LeetCode之226. Invert Binary Tree
  3. [ html canvas globalCompositeOperation ] canvas绘图属性 设置合成图像如何显示 属性演示
  4. LeetCode 2 Add Two Sum 解题报告
  5. c++中的原子操作
  6. jquery 3D 标签云
  7. Anaconda packages list
  8. android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解
  9. #284 div.2 C.Crazy Town
  10. 求a和b的最大公约数
  11. 手动整合实现SSH项目开发01
  12. (办公)springboot配置aop处理请求.
  13. LeetCode专题-Python实现之第9题:Palindrome Number
  14. Angular+NodeJs+MongoDB搭建前后端程序
  15. HotSpot虚拟机对象探秘-笔记
  16. SSD硬盘测速较低的原因备忘
  17. jQuery实现Ajax请求时,页面显示等待的效果,超过指定请求时间后,进行其他操作
  18. 【数学建模】day08-数理统计III
  19. web前端3.0时代,“程序猿”如何“渡劫升仙”?
  20. 五大常用算法之二:动态规划算法(DP)

热门文章

  1. Confluence 6 创建-使用-删除快捷链接
  2. SpringBoot集成前端模版(thymeleaf)
  3. string标准C++中的的用法总结(转)
  4. 《剑指offer》栈的插入弹出序列
  5. 《剑指offer》 数值的整数次方
  6. laravel 框架后台主菜单接口
  7. 基于kali linux无线网络渗透测试
  8. bitset用法详解
  9. 第八周学习总结-C#、C++
  10. 首次使用idea步骤