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

/*
只需判断等效边和必选边的个数和n-1的关系即可
*/
#include<stdio.h>
#include<stdlib.h>
#define N  110
struct node {
 int u,v,w;
}f[N*N*2];
int cmp(const void *a,const void*b) {
return (*(struct node *)a).w-(*(struct node *)b).w;
}
int pre[N];
int find(int x) {
 if(x!=pre[x])
    pre[x]=find(pre[x]);
 return pre[x];
}
int main() {
      int t,n,m,i,j,sum,ff,total;
      scanf("%d",&t);
      while(t--) {
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
            pre[i]=i;
       for(i=0;i<m;i++)
        scanf("%d%d%d",&f[i].u,&f[i].v,&f[i].w);
       qsort(f,m,sizeof(f[0]),cmp);
       j=0;sum=0;ff=0;total=0;
       for(i=0;i<m&&ff<n-1;) {
          j=i;
          while(f[i].w==f[j].w&&j<m) {
            int a=find(f[j].u);
            int b=find(f[j].v);
            if(a!=b)
               sum++;
               j++;
          }
          j=i;
          while(f[i].w==f[j].w&&j<m&&ff<n-1) {
            int a=find(f[j].u);
            int b=find(f[j].v);
            if(a!=b)  {
                pre[a]=b;
            ff++;
           // printf("%d %d\n",f[j].u,f[j].v);
            total+=f[j].w;
            }
            j++;
          }
          i=j;
       }
       if(sum>n-1)
        printf("Not Unique!\n");
       else
        printf("%d\n",total);
      }
return 0;
}

poj 1679 判断最小生成树是否唯一,布布扣,bubuko.com

时间: 2024-07-30 10:17:46

poj 1679 判断最小生成树是否唯一的相关文章

poj 1679 判断MST是不是唯一的

判断MST是不是唯一的 如果是唯一的 就输出最小的权值和 如果不是唯一的 就输出Not Unique! 先求出最小的权值和 然后一条边一条边的删先标记MST中所使用的边 删边就是屏蔽这条边后 再对剩下的边求MST 如果最后的权值和 与开始算出的最小的那个 相等 就说明不是唯一的 Sample Input 2 //T3 3 //n m1 2 1// u v w2 3 23 1 34 41 2 22 3 23 4 24 1 2Sample Output 3Not Unique! Kruskal 1

poj 1679 The Unique MST (判断最小生成树是否唯一)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20679   Accepted: 7255 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

poj 1679 The Unique MST (判断最小生成树是否唯一)

链接:poj 1679 题意:判断最小生成树是否唯一, 若唯一,输出最小权值和,否则,输出  Not Unique! 判断最小生成树是否唯一的思路: 1.对图中的每一条边,扫描其他边,如果存在相同权值的边,则对该边做标记 2.然后用Kruskal算法或Prim算法求MST 3.求得MST后,如果该MST中未包含做了标记的边,即可判断MST唯一: 如果包含做了标记的边,则依次去掉这些边的一条边,再求MST, 如果求得的MST权值和原来的MST的权值一样,即可判断MST不唯一. 个人思路是先求最小生

POJ 1679 The Unique MST(判断最小生成树是否唯一)

题目链接: http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G

POJ 1679 The Unique MST 判断最小生成树是否唯一/次小生成树

题目链接: 1679 题意: 给出 M个点N条边 求它的的最小生成树 不唯一则输出:Not Unique! 题解: prim:判断"最小生成树是否唯一"可以理解为"最小生成树和次小生成树是否相等" 求次小生成树的步骤如下 1)先求出最小生成树T,在prim的同时,用一个矩阵maxx[u][v]记录在树中连接u-v的路径中权值最大的边. 2)枚举所有不在T中的边map[u][v],加入边u-v,删除权值为maxx[u][v]的边; 3)找到MST-maxx[u][v]

poj1679The Unique MST判断最小生成树是否唯一以及求次小生成树边权和的讲解

Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22346   Accepted: 7924 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected graph G =

[kuangbin带你飞]专题六 最小生成树 K - The Unique MST (判断最小生成树是否唯一)

K - The Unique MST 题目链接:https://vjudge.net/contest/66965#problem/K 题目: 给定连接的无向图,告诉它的最小生成树是否唯一. 定义1(生成树):考虑连通的无向图G =(V,E). G的生成树是G的子图,比如T =(V',E'),具有以下属性:    1. V'= V.    2.T是连接的和非循环的. 定义2(最小生成树):考虑边加权,连通,无向图G =(V,E). G的最小生成树T =(V,E')是总成本最小的生成树. T的总成本

nyoj 修路方案 (判断最小生成树是否唯一)

裸 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 struct node 7 { 8 int x, y, dis; 9 int flag; 10 } a[200010]; 11 12 int cmp(node x, node y) 13 { 14 return x.dis<y.dis; 15 } 16 int father[5

POJ 1679 The Unique MST (Kruskal 判最小生成树是否唯一)

The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21646 Accepted: 7661 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected