POJ 1679 The Unique MST
2015-02-21 16:35
190 查看
给出一些边,问它的最小生成树是否唯一,唯一则输出最小生成树的边和。否则输出不唯一。kruskal搞一搞就可以了。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; struct edge { int u,v,w; }e[110*110]; int n,m,mst; bool flag; int fa[110]; void init() { flag = true; for(int i = 0; i <= n; i++) fa[i] = i; } int getfa(int x) { return fa[x] == x ? x : fa[x] = getfa(fa[x]); } bool cmp(edge a,edge b) { return a.w < b.w; } void Kruscal() { int num = 0; int path[110]; mst = 0; sort(e,e+m,cmp); for(int i = 0; i < m; i++) { int x = getfa(e[i].u); int y = getfa(e[i].v); if(x != y) { fa[x] = y; mst += e[i].w; path[num++] = i; } } if(num != n -1) { flag = 0; return ; } for(int i = 0; i < num; i++) { int mst1 = 0,num1 = 0; init(); for(int j = 0; j < m; j++) { if(path[i] == j) continue; int x = getfa(e[j].u); int y = getfa(e[j].v); if(x != y) { fa[x] = y; num1 ++; mst1 += e[j].w; } } if(num1 == num && mst1 == mst) { flag = false; return ; } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); for(int i = 0; i < m; i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); Kruscal(); if(!flag) printf("Not Unique!\n"); else printf("%d\n",mst); } return 0; }
相关文章推荐
- POJ-1679 The Unique MST 次小生成树
- poj1679——The Unique MST
- POJ 1679 The Unique MST(次小生成树)
- poj 1679 The Unique MST (次小生成树)
- POJ 1679 The Unique MST
- POJ 1679 The Unique MST
- poj_1679 The Unique MST
- POJ 1679 The Unique MST 次小生成树Prim
- poj 1679 The Unique MST (最小生成树)
- poj1679——The Unique MST
- poj 1679 The Unique MST(最小树不唯一的判定)
- poj 1679 The Unique MST
- poj 1679 The Unique MST ( 次小生成树 )
- POJ 1679 The Unique MST (次小生成树Prime/Kruskal)
- poj 1679 The Unique MST(次小生成树)
- poj 1679 The Unique MST
- POJ1679:The Unique MST
- POJ 1679 The Unique MST(判断最小生成树是否唯一)
- POJ 1679 The Unique MST
- poj 1679 The Unique MST(次小生成树)