51nod 1640 天气晴朗的魔法(最小生成树)
2017-08-03 23:04
337 查看
感觉这题题目挺绕,问了下我朋友题意,否则还真看不懂题目。
“要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大。”最大值尽可能的小,先求个最小生成树,找到树里面权值最大的那个边,然后再求个最大生成树,不过要保证每条边的权值都要比都要比刚才找到的那条边的权值小。
“要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大。”最大值尽可能的小,先求个最小生成树,找到树里面权值最大的那个边,然后再求个最大生成树,不过要保证每条边的权值都要比都要比刚才找到的那条边的权值小。
#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; }
相关文章推荐
- 51nod-1640--天气晴朗的魔法(简单最小生成树)
- 51nod 1640 天气晴朗的魔法 【二分枚举最大生成树】or【最小&&最大 生成树】
- 51nod 1640 天气晴朗的魔法 最小生成树
- 51nod 1640 天气晴朗的魔法 prime队列+最小生成树+最大生成树+邻接表
- 51nod 1640 天气晴朗的魔法【最小生成树概念】
- 51NOD 1640 天气晴朗的魔法 最小生成树 kuskal
- 51nod 1640 天气晴朗的魔法 最小生成树
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法 (图论,并查集)
- 51Nod - 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法 克鲁斯卡尔
- 51nod1640-最小生成树&二分|性质-天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法【二分+最大生成树】
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法 By Assassin
- 51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了
- 51nod 1640天气晴朗的魔法(克鲁斯卡尔,并查集)
- 51nod 1640 天气晴朗的魔法
- 天气晴朗的魔法 51Nod - 1640