题意:
在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方。另外还可以选择q个套餐,可以购买,套餐内的所有点将会被连通。求最小花费。
题解:
如果不选择套餐的话,就是裸的MST。现在有了套餐可以选择,可以选择多个,那么就把它们(套餐里的点)先加入到生成树里,用位运算枚举集合的子集。
#include#include #include #include #include using namespace std;const int maxn=1005,INF=0x3f3f3f3f;int n,cnt;int par[maxn];struct edge{ int u,v,cost; bool operator <(const edge& a) const//重载 <运算符 { return cost >t; while(t--) { int q; cin>>n>>q; for(int i=0;i >bu[i].num>>bu[i].cost; for(int j=0;j运算符>>bu[i].a[j]; } cnt=0; for(int i=1;i<=n;i++) { cin>>p[i].x>>p[i].y; } for(int i=1;i >=1; } mst+=kruskal(); ans=min(ans,mst); } cout< <