首页 > 代码库 > BZOJ 3714 PA 2014 Kuglarz 最小生成树
BZOJ 3714 PA 2014 Kuglarz 最小生成树
题目大意:桌面上倒扣着一些杯子,在这些杯子的有一些杯子底下有小球。可以询问i到j号杯子下面共有多少个小球的奇偶性,花费c[i][j],问至少花费多少可以得知杯子下面小球的存在情况。
思路:看这个题怎么看怎么想小胖的奇偶,其实是一样的,只不过这个题是利用了那个题的结论。没做过的可以先做做那个题,用并查集维护一下。那么这个题就很裸了,只是一个最小生成树的过程。
CODE:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 2010 using namespace std; struct Edge{ int x,y,length; Edge(int _ = 0,int __ = 0,int ___ = 0):x(_),y(__),length(___) {} bool operator <(const Edge &a)const { return length < a.length; } }edge[MAX * MAX]; int cnt,total; int father[MAX]; int Find(int x) { if(father[x] == x) return x; return father[x] = Find(father[x]); } int main() { cin >> cnt; for(int i = 1; i <= cnt + 1; ++i) father[i] = i; for(int i = 1; i <= cnt; ++i) for(int z,j = i; j <= cnt; ++j) { scanf("%d",&z); edge[++total] = Edge(i,j + 1,z); } sort(edge + 1,edge + total + 1); long long ans = 0,t = 0; for(int i = 1; i <= total; ++i) { int fx = Find(edge[i].x); int fy = Find(edge[i].y); if(fx != fy) { father[fy] = fx; ans += edge[i].length; if(++t == cnt) break; } } cout << ans << endl; return 0; }
BZOJ 3714 PA 2014 Kuglarz 最小生成树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。