51nod 1640 天气晴朗的魔法(最小生成树)
来源:互联网 发布:三菱fxplc编程手册 编辑:程序博客网 时间:2024/05/22 03:22
感觉这题题目挺绕,问了下我朋友题意,否则还真看不懂题目。
“要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大。”最大值尽可能的小,先求个最小生成树,找到树里面权值最大的那个边,然后再求个最大生成树,不过要保证每条边的权值都要比都要比刚才找到的那条边的权值小。
#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5+10;const int MAXM = 2e5+10;struct Edge{ int u,v,w;};Edge edge[MAXM];int F[MAXN];int tol,maxn;void addedge(int u, int v, int w){ edge[tol].u = u; edge[tol].v =v; edge[tol++].w = w;}bool cmp(const Edge& a, const Edge& b){ return a.w < b.w;}int find(int x){ if(F[x] == -1) return x; else return F[x] = find(F[x]);}int Kruskal(int n)//找到最大值的那个边的权值{ memset(F,-1,sizeof(F)); sort(edge,edge+tol,cmp); int cnt = 0; int ans = 0; for(int i = 0; i < tol; ++i) { int u = edge[i].u; int v = edge[i].v; int w = edge[i].w; int t1 = find(u); int t2 = find(v); if(t1 != t2) { if(w > ans) ans = w; F[t1] = t2; cnt++; } if(cnt == n-1) break; } if(cnt < n-1) return -1; return ans;}long long KruskalT(int n){ memset(F,-1,sizeof(F)); int cnt = 0; long long ans = 0; for(int i = tol - 1; i >= 0; --i) { if(edge[i].w > maxn) continue; int u = edge[i].u; int v = edge[i].v; int w = edge[i].w; int t1 = find(u); int t2 = find(v); if(t1 != t2) { ans += w; F[t1] = t2; cnt++; } if(cnt == n-1) break; } if(cnt < n-1) return -1; return ans;}int main(){ ios::sync_with_stdio(false); int N,M,u,v,w; cin >> N >> M; for(int i = 0; i < M; ++i) { cin >> u >> v >> w; addedge(u,v,w); } maxn = Kruskal(N); long long res = KruskalT(N); cout << res << endl; return 0;}
阅读全文
0 0
- 51nod 1640 天气晴朗的魔法(最小生成树)
- 51NOD 1640 天气晴朗的魔法 最小生成树 kuskal
- 51nod 1640 天气晴朗的魔法【最小生成树概念】
- 51nod 1640 天气晴朗的魔法 prime队列+最小生成树+最大生成树+邻接表
- 51nod 1640 天气晴朗的魔法 【二分枚举最大生成树】or【最小&&最大 生成树】
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51NOD 1640 天气晴朗的魔法(二分+最大生成树)
- 51nod 1640 天气晴朗的魔法【二分+最大生成树】
- nod-1640-天气晴朗的魔法
- 天气晴朗的魔法 51Nod
- 51Nod-1640-天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法(kruskal)
- 51nod 1640 天气晴朗的魔法 By Assassin
- 51nod 1640 天气晴朗的魔法 克鲁斯卡尔
- C语言 树
- python中的iter()函数与next()函数
- Prime Time 素数筛选+玄学1e-8
- centos6 安装 jenkins2.7.2
- 解析C++中为什么模板不支持分离编译?
- 51nod 1640 天气晴朗的魔法(最小生成树)
- 典型的数组处理代码(algs4)
- UVa401-Palindromes
- 前端面试纪实(二):div居中,垂直或者水平居中
- squid源码安装
- socket编程 及select poll epoll示例
- 【HDU1863】畅通工程(最小生成树)
- 一道ctf中的编码问题
- UITableViewCell的宽度的修改