标签:des style os io for cti div ar
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 (次小生成树)
标签:des style os io for cti div ar
原文地址:http://blog.csdn.net/u011345136/article/details/38146065