poj 1679 The Unique MST 判断最小生成树是否唯一(图论)
2015-08-02 15:19
609 查看
借用的是Kruskal的并查集,算法中的一点添加和改动。
通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一。
如果不知道这个最小生成树的算法,还是先去理解下这个算法的原理,再继续看。
多加的几行与cnt2很类似的cnt1统计,是统计当前未选边中相同长度的边还有哪些可以选,但不标记,只是为了把当前可选的边全部统计出来。
其他细节,自己要细心点~
通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一。
如果不知道这个最小生成树的算法,还是先去理解下这个算法的原理,再继续看。
多加的几行与cnt2很类似的cnt1统计,是统计当前未选边中相同长度的边还有哪些可以选,但不标记,只是为了把当前可选的边全部统计出来。
其他细节,自己要细心点~
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <algorithm> #include <climits> #include <queue> using namespace std; //Kruskal算法 求最小生成树是否唯一 const int MAX = 110; int F[MAX]; struct Edge { int u,v,w; } edge[MAX*MAX]; int tol; void addedge(int u,int v,int w) { edge[tol].u = u; edge[tol].v = v; edge[tol++].w = w; } bool cmp(Edge a,Edge b) { return a.w < b.w; } int find(int x) { if(F[x] == -1) return x; else return F[x] = find(F[x]); } void Kruskal(int n) { memset(F,-1,sizeof(F)); sort(edge,edge+tol,cmp); int cnt1 = 0,cnt2 = 0; int ans = 0; for(int i = 0; i < tol; ) { int j = i; while(j < tol && edge[j].w == edge[i].w) { int u = edge[j].u; int v = edge[j].v; int t1 = find(u); int t2 = find(v); if(t1 != t2) { cnt1++; } j++; } j = i; while(j < tol && edge[j].w == edge[i].w) { int u = edge[j].u; int v = edge[j].v; int w = edge[j].w; int t1 = find(u); int t2 = find(v); if(t1 != t2) { ans += w; F[t1] = t2; cnt2++; } j++; } i = j; if(cnt2 == n - 1) break; } //printf("%d %d\n",cnt1,cnt2); if(cnt1 > cnt2 || cnt2 != n -1) printf("Not Unique!\n"); else printf("%d\n",ans); } int main(void) { int t,m,n,i,x,y,w; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); tol = 0; for(i = 0; i < m; i++) { scanf("%d %d %d",&x,&y,&w); addedge(x,y,w); } Kruskal(n); } return 0; }
相关文章推荐
- apue 第十五章 进程间通信
- UILabel字体加粗 IOS
- leetcode 60: Permutation Sequence
- Common Subsequence(最长公共子序列DP)
- 调整UILabel行高间距
- codeforces 566F F. Clique in the Divisibility Graph(dp)
- 常用类库StringBuilder
- 【LeetCode】232 & 225 - Implement Queue using Stacks & Implement Stack using Queues
- 在iOS 8中使用UIAlertController
- 【转】UITableView使用详解
- 洛谷1373 小a和uim之大逃离
- easyui dataGrid接收嵌套JSON
- easyui dialog子窗口关闭父窗口
- android:layout_centerHorizontal="true"和 android:gravity="center_horizontal"什么区别?
- Selenium2学习-026-WebUI自动化实战实例-024-获取页面元素
- uuid (guid)全局唯一标识符
- Android SDK Tools Platform-tools Build-tools
- hdu 5329 Question for the Leader 枚举,划分图为k个联通的子图
- Gym 100570E : Palindrome Query
- IOS开发之UIScrollViewDelegate详解