UVA 1151 Buy or Build(生成树+二进制枚举)
来源:互联网 发布:美国钻井平台数据 9月2 编辑:程序博客网 时间:2024/05/07 00:28
题意思路:见紫书
#include<bits/stdc++.h>using namespace std;const int maxn = 1000+10;const int maxm = 10000+10;#define INF 1e9int n,m;struct Edge{int u,v,dist;Edge(){}Edge(int u,int v,int dist):u(u),v(v),dist(dist){}bool operator<(const Edge&rhs)const{return dist < rhs.dist;}};struct point{int x,y;};point p[maxn];int fa[maxn];Edge e[maxn*maxn];int findset(int x){return fa[x]==-1?x:fa[x]=findset(fa[x]);}int di(point a,point b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}int kruskal(){int sum = 0;int ans = 0;//sort(e,e+m);for (int i = 0;i<m;i++){ if (findset(e[i].u)!=findset(e[i].v)){fa[findset(e[i].u)]=findset(e[i].v);ans+=e[i].dist;if (++sum>=n-1)return ans;}}return ans;}int T,cas=1;vector<int>g[10];int c[10];int main(){scanf("%d",&T);while (T--){if (cas>1)printf("\n");cas++;int q;scanf("%d%d",&n,&q);for (int i = 0;i<q;i++){ int temp,cnt;g[i].clear();scanf("%d",&cnt);scanf("%d",&c[i]);for (int j = 0;j<cnt;j++){scanf("%d",&temp);g[i].push_back(temp);}}for (int i = 1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);m=0; for (int i = 1;i<=n;i++)for (int j = i+1;j<=n;j++){e[m++]=Edge(i,j,di(p[i],p[j]));}sort(e,e+m);memset(fa,-1,sizeof(fa));int ans = kruskal();for (int s =0;s<(1<<q);s++){int cost = 0;memset(fa,-1,sizeof(fa));for (int j= 0;j<q;j++){if ((s>>j)&1) continue;cost+=c[j];for (int k = 1;k<g[j].size();k++){ if (findset(g[j][k])!=findset(g[j][0])) { fa[findset(g[j][k])]=findset(g[j][0]); }}}ans = min(cost+kruskal(),ans);}printf("%d\n",ans);}}
0 0
- UVA 1151 Buy or Build(生成树+二进制枚举)
- uva-1151-Buy or Build-二进制枚举子集,并查集,最小生成树,kruskal
- UVA 1151 && POJ 2784 - Buy or Build 最小生成树 二进制枚举
- UVa 1151 Buy or Build--最小生成树+二进制选择
- UVA 1151 - Buy or Build(最小生成树,二进制子集生成)
- uva 1151 Buy or Build 克鲁斯卡尔+二进制枚举
- [最小生成树+二进制枚举]UVa1151 - Buy or Build
- UVA1511 Buy or Build 二进制枚举+最小生成树kruskal
- UVA 1151 Buy or Build(最小生成树+枚举子集)
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
- 【UVA】1151 - Buy or Build(二进制枚举子集 + 并查集)
- POJ 2784 Buy or Build(二进制枚举 + 最小生成树)
- uva 1151 Buy or Build (最小生成树)
- UVA 1151 Buy or Build (最小生成树)
- UVA 1151 Buy or Build 最小生成树+二进制选取子集
- Poj(2784),二进制枚举+最小生成树kruskal Buy or Build
- UVa 1151 Buy or Build (最小生成树)
- 二进制枚举+prim buy or build 问题
- Android layout属性大全
- oracle中的schema
- googlesamples/android-topeka学习笔记(一)-----一些不知道的属性
- 第7周项目1-成员函数、友元函数和一般函数有区别(1)
- JavaScript简介
- UVA 1151 Buy or Build(生成树+二进制枚举)
- 网络编程--xml数据解析
- 中缀表达式转后缀表达式
- HttpClientUtil读取网络服务类容
- 概率 · dp练习 (16.04.16)
- oracle中expdp和impdp(数据泵)
- EBO,c++编译器有empty继承优化(编译期)
- 新浪支付接口对接的总结
- DirectionalLight与shadow