前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ 1679 The Unique MST(Kruskal+记录边)

POJ 1679 The Unique MST(Kruskal+记录边)

作者头像
Ch_Zaqdt
发布2019-01-10 16:00:51
5080
发布2019-01-10 16:00:51
举报
文章被收录于专栏:Zaqdt_ACM

题目链接:http://poj.org/problem?id=1679

       题意是给了n个点,m条边,问最小生成树是否唯一

       首先我们求一个最小生成树把每条边记录下来,然后我们对这个最小生成树进行删边操作,再删除一条边后,能不能再生成一个权值相同的最小生成树就行了。我刚开始有一个错误的想法,但是感觉是对的...就是我们求一个最小生成树,然后把每条边和他的权值记录下来,然后再去遍历所有边去找没有记录过的边而且权值已经出现过的边,这样的话就不是唯一的最小生成树了。然而这画个图就可以看出来显然是错的,因为会出现不连通的情况。


AC代码:

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#define maxn 105
using namespace std;
struct Node{
  int x,y,w;
  bool operator < (const Node &a) const{
    return a.w > w;
  }
}Edge[maxn * maxn];
int pre[maxn],cnt[maxn],num;
int T,n,m,ans;
bool flag;

void init(){
  for(int i=0;i<=n;i++) pre[i] = i;
}

void add(int u,int v,int w){
  Edge[num].x = u;
  Edge[num].y = v;
  Edge[num++].w = w;
}

int Find(int x){
  if(x != pre[x]) pre[x] = Find(pre[x]);
  return pre[x];
}

void Kruskal(){
  ans = 0;
  int xx = 0;
  sort(Edge, Edge + num);
  for(int i=0;i<m;i++){
    int fx = Find(Edge[i].x);
    int fy = Find(Edge[i].y);
    if(fx != fy){
      pre[fy] = fx;
      cnt[xx++] = i;
      ans += Edge[i].w;
    }
  }
  for(int k=0;k<xx;k++){
    init();
    int sum = 0;
    int yy = 0;
    for(int i=0;i<m;i++){
      if(i == cnt[k]) continue;
      int fx = Find(Edge[i].x);
      int fy = Find(Edge[i].y);
      if(fx != fy){
        pre[fy] = fx;
        yy ++;
        sum += Edge[i].w;
      }
    }
    if(yy == n - 1 && sum == ans){
      flag = false;
      return ;
    }
  }
}

int main()
{
  scanf("%d",&T);
  while(T--){
    scanf("%d%d",&n,&m);
    init();
    for(int i=0;i<m;i++){
      int u, v, w;
      scanf("%d%d%d",&u,&v,&w);
      add(u, v, w);
      // add(v, u, w);
    }
    num = 0;
    flag = true;
    Kruskal();
    if(flag) printf("%d\n", ans);
    else puts("Not Unique!");
  }
  return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年12月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档