poj 1679 The Unique MST
2015-08-31 15:14
387 查看
原题链接:http://poj.org/problem?id=1679
判断最小生成树是否唯一。。
判断最小生成树是否唯一。。
[code]#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<map> using std::map; using std::min; using std::sort; using std::pair; using std::vector; using std::multimap; #define pb(e) push_back(e) #define sz(c) (int)(c).size() #define mp(a, b) make_pair(a, b) #define all(c) (c).begin(), (c).end() #define iter(c) __typeof((c).begin()) #define cls(arr, val) memset(arr, val, sizeof(arr)) #define cpresent(c, e) (find(all(c), (e)) != (c).end()) #define rep(i, n) for(int i = 0; i < (int)n; i++) #define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i) const int N = 110; const int INF = 0x3f3f3f3f; int V, E; struct edge { int u, v, w; inline bool operator<(const edge &x) const { return w < x.w; } }G[(N * N) << 1], X[N * N]; struct Kruskal { int par , rank ; inline void init() { rep(i, V + 1) { par[i] = i; rank[i] = 0; } } inline int find(int x) { while(x != par[x]) { x = par[x] = par[par[x]]; } return x; } inline bool unite(int x, int y) { x = find(x), y = find(y); if(x == y) return false; if(rank[x] < rank[y]) { par[x] = y; } else { par[y] = x; rank[x] += rank[x] == rank[y]; } return true; } inline void built() { int u, v, w; rep(i, E) { scanf("%d %d %d", &u, &v, &w); G[i] = (edge){ u, v, w }; } } inline int kruskal_1(int &p) { init(); int ans = 0; rep(i, E) { int u = G[i].u, v = G[i].v; if(unite(u, v)) { ans += G[i].w; X[p++] = (edge){ u, v, G[i].w }; } } return ans; } inline int kruskal_2(int x, int y) { init(); int ans = 0; rep(i, E) { int u = G[i].u, v = G[i].v; if(u == x && y == v) continue; if(unite(u, v)) { ans += G[i].w; } } return ans; } inline void solve() { built(); sort(G, G + E); int p = 0, ans = kruskal_1(p); rep(i, p) { int ret = kruskal_2(X[i].u, X[i].v); int t = -1; for(int j = 1; j <= V; j++) { if(par[j] == j) t++; } if(t) continue; if(ret == ans) { ans = -1; break; } } if(-1 == ans) puts("Not Unique!"); else printf("%d\n", ans); } }go; int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w+", stdout); #endif int t; scanf("%d", &t); while(t--) { scanf("%d %d", &V, &E); go.solve(); } return 0; }
相关文章推荐
- DataGridView Index -1 does not have a value 错误
- SoapUI 引用第三方jar包和引用Groovy脚本
- break 退出循环 continue 提前进入下一轮循环 while的特殊用法
- UINavigationController详解
- Xamarin iOS UIAlertView
- Ehcache配置时出错- Another unnamed CacheManager already exists in the same VM. Please provide unique name
- ExtJs 集成UEditor and KindEditor
- 解决报错:A potentially dangerous Request.Form value was detected from the client
- Enable Debug log for Requests
- How to save cookie in file for Requests
- 2015第18本:从0到1,ZERO to ONE, Notes on startups, or how to build the future
- Android组件及UI框架大全
- UINavigationController操作
- UIActionSheet
- UIAlertView(提示框)
- web_custom_request函数之Body详解
- 【SBT】 POJ 3481 Double Queue
- 转-关于UIView的autoresizingMask属性的研究
- J版OpenStack错误libvirtError: Invalid value 'xx-tt,yy-zz' for 'cpuset.cpus': Invalid Argument解决
- iphone开发之表格组件UITableView的使用(三)通过加载plist文件字典转模型方式展示分组数据