--wrong answer

本文详细解析了如何使用最小生成树算法解决特定问题,并通过具体的代码实现展示了算法的工作原理。通过对点集之间的距离计算和使用并查集进行连接判断,实现了在给定点集和额外条件下的最小生成树构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87121#problem/C
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int M = 1000 * 999/2+5; int w[100],nq[100]; int qs[100][100]; int pre[3013]; int eds ,n; struct c_xy{ int x,y; }point[3100]; struct node{ int u,v; int cost; }edges[M]; bool cmp(node a,node b){ return a.cost < b.cost; } void init(){ int k = 0; for(int i = 0;i<n;i++) for(int j = i+1;j<n;j++){ edges[k].cost = (point[i].x - point[j].x) * (point[i].x - point[j].x) + (point[i].y - point[j].y)*(point[i].y - point[j].y); edges[k].u = i+1; edges[k].v = j+1; k++; } eds = k; } void init_union(){ for(int i = 0;i <= 3010;i++){ pre[i] = i; } } int find(int x) { int k, j, r; r = x; while(r != pre[r]) r = pre[r]; k = x; while(k != r) { j = pre[k]; pre[k] = r; k = j; } return r; } int main(){ int flag = 1; int q; int t; scanf("%d",&t); while(t--){ long long ans = 0x3f3f3f3f; scanf("%d%d",&n,&q); for(int i = 0;i<q;i++){ scanf("%d%d",&nq[i],&w[i]); for(int j = 0;j<nq[i];j++) scanf("%d",&qs[i][j]); } for(int i = 0;i<n;i++){ scanf("%d%d",&point[i].x,&point[i].y); } init(); sort(edges,edges+eds,cmp); for(int i = 0;i<(1<<q);i++){ init_union();//并查集的初始化 long long s = 0; int nums = 0; for(int j = 0;j<q;j++){ if(i&(1<<j)){ s+=w[j]; for(int k = 0;k<nq[j];k++){//如果选取这个集合,则进行并查集的处理,表示已经将这些链接了 int v_1 = find(qs[j][k]); int u_1 = find(qs[j][0]); if(u_1 != v_1){ nums++; pre[v_1] = u_1; } } } } for(int i = 0;i<eds&&nums < n-1;i++){ int u = find(edges[i].u); int v = find(edges[i].v); if(u!=v){ nums ++; pre[u] = v; s += edges[i].cost; } } ans = min(ans,s); } if(flag == 1){ flag = 0; }else puts(""); printf("%lld\n",ans); } }

  

转载于:https://www.cnblogs.com/lovelystone/p/4727779.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值