Description
Input
Output
Sample Input
2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2
Sample Output
3 Not Unique!
题意:求最小生成树是否唯一
思路:次小生成树的应用,先求出最小生成树,然后枚举删除的边,再求最小生成树,如果值一样,代表不唯一
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> using namespace std; const int maxn = 105; const int inf = 0x3f3f3f3f; struct Edge { int from, to, dist; } edge[maxn*maxn]; int n, m; int mst, fa[maxn]; int uni; int cmp(Edge a, Edge b) { return a.dist < b.dist; } int find(int x) { if (x != fa[x]) fa[x] = find(fa[x]); return fa[x]; } void init() { for (int i = 1; i <= n; i++) fa[i] = i; } void kruskal(){ int num[maxn], cnt = 0; init(); sort(edge, edge+m, cmp); mst = 0; for (int i = 0; i < m; i++) { int x = find(edge[i].from); int y = find(edge[i].to); if (x != y) { fa[y] = x; mst += edge[i].dist; num[cnt++] = i; } } uni = 1; int ans, tmp; for (int k = 0; k < cnt; k++) { init(); ans = 0; tmp = 0; for (int i = 0; i < m; i++) { if (i == num[k]) continue; int x = find(edge[i].from); int y = find(edge[i].to); if (x != y) { fa[y] = x; ans += edge[i].dist; tmp++; } } if (tmp != cnt) continue; if (ans == mst) { uni = 0; return; } } } int main() { int t, i, j; scanf("%d", &t); while(t --){ scanf("%d%d", &n, &m); for(i = 0; i < m; i ++) scanf("%d%d%d", &edge[i].from, &edge[i].to, &edge[i].dist); kruskal(); if(!uni) printf("Not Unique!\n"); else printf("%d\n", mst); } return 0; }
POJ - 1679 The Unique MST (次小生成树),布布扣,bubuko.com
POJ - 1679 The Unique MST (次小生成树)
原文:http://blog.csdn.net/u011345136/article/details/38146065