题目大意:桌面上倒扣着一些杯子,在这些杯子的有一些杯子底下有小球。可以询问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 最小生成树
原文地址:http://blog.csdn.net/jiangyuze831/article/details/40790863