博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1151 Buy or Build (最小生成树)
阅读量:7071 次
发布时间:2019-06-28

本文共 2289 字,大约阅读时间需要 7 分钟。

先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点。正确性是基于一个贪心,

在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少。

边比较多,用prim求最小生成树,效果比Kruskal好,枚举套餐的时候在用Kruskal。

prim和dijkstra的区别在于点距离的定义。

#include
using namespace std;const int maxn = 1005;int n,q;int C[9];vector
Buy[9];#define PB push_backint x[maxn],y[maxn];#define squ(x) ((x)*(x))int dist(int a,int b) { return squ(x[a]-x[b])+squ(y[a]-y[b]); }struct Edge{ int u,v,w; Edge(){} Edge(int u,int v,int w):u(u),v(v),w(w){} bool operator < (const Edge& x) const { return w > x.w; }}edges[maxn];bool EdgeLess(const Edge &x,const Edge &y) { return x.w < y.w; }int ecnt;int d[maxn];bool done[maxn];const int INF = 0x3f3f3f3f;int Prim(){ fill(d,d+n,INF); fill(done,done+n,0); ecnt = 0; priority_queue
q; q.push(Edge(-1,0,0)); // dummy edge int tot = d[0] = 0; while(q.size()){ Edge x = q.top(); q.pop(); if(done[x.v]) continue; edges[ecnt++] = x; tot += x.w; done[x.v] = true; for(int i = 1; i < n; i++){ if(done[i]) continue; int cost = dist(x.v,i); if(d[i]>cost){ d[i] = cost; q.push(Edge(x.v,i,cost)); } } } return tot;}int pa[maxn];int Find(int x) { return x==pa[x]?x:pa[x]=Find(pa[x]); }void Union(int a,int b,int &cnt){ int s1 = Find(a),s2 = Find(b); if(s1 != s2){ pa[s1] = s2; cnt--; }}int Kruskal(int cnt){ if(!cnt) return 0; int ans = 0; for(int i = 1; i < ecnt; i++){ Edge &e = edges[i]; int s1 = Find(e.u), s2 = Find(e.v); if(s1 != s2) { ans += e.w; pa[s1] = s2; cnt--; if(!cnt) return ans; } } return ans;}int main(){ //freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&q); for(int i = 0; i < q; i++){ int t; scanf("%d%d",&t,C+i); Buy[i].clear(); while(t--) { int c; scanf("%d",&c); Buy[i].PB(c-1); } } for(int i = 0; i < n; i++){ scanf("%d%d",x+i,y+i); } int ans = Prim(); sort(edges+1,edges+ecnt,EdgeLess); for(int mask = 1,M = 1<

 

转载于:https://www.cnblogs.com/jerryRey/p/4758297.html

你可能感兴趣的文章
to use extended Windows dialogs
查看>>
3A级VR游戏将至?汪丛青力挺G胖正在开发的三款VR游戏
查看>>
Mongodb 3.2 Manual阅读笔记:CH9 存储
查看>>
关于同一线程两次调用EnterCriticalSection的测试
查看>>
说说网络通信模型
查看>>
Javac编译原理
查看>>
Wireshark网络抓包(二)——过滤器
查看>>
Ubuntu系统主题及插件工具等官方地址
查看>>
Linux 特殊目录
查看>>
AnguarJs-01-HelloWorld
查看>>
实现前端MD5加密与记住用户名密码功能
查看>>
command for cut
查看>>
Fortinet安全能力融入华为CloudEPN 联合防御网络威胁
查看>>
使用yum安装MariaDB
查看>>
RHEL7.2配置安装MariaDB数据库
查看>>
百度云管家 v 5.5.0 破解安装版
查看>>
语音识别技术受追捧,无法独立工作的“速记神器”何时才能成为新亮点?
查看>>
对Context的重新思考
查看>>
Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法
查看>>
顶级MySQL主从复制企业应用
查看>>