社区讨论

球跳,30pts

P2212[USACO14MAR] Watering the Fields S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlhmzyu3
此快照首次捕获于
2026/02/11 14:16
上周
此快照最后确认于
2026/02/13 10:05
6 天前
查看原帖
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n,c,m,f[2005],x[2005],y[2005],sum;
struct edge
{
	int u,v,w;
};
edge e[4000000];
bool cmp(edge q,edge p)
{
    return q.w<p.w;
}
int getf(int v)
{
	if(f[v]==v)return v;
	return f[v]=getf(f[v]);
}
int merge(int v,int u)
{
	int t1=getf(v),t2=getf(u);
	if(t1!=t2)
	{
		f[t2]=t1;
		return 1;
	}
	return 0;
}
void qui(int l,int r)
{
	int i,j;
	edge t;
	if(l>r)return;
	i=l,j=r;
	while(i!=j)
	{
		while(e[j].w>=e[l].w&&i<j)j--;
		while(e[i].w<=e[l].w&&i<j)i++;
		if(i<j)t=e[i],e[i]=e[j],e[j]=t;
	}
	t=e[l],e[l]=e[i],e[i]=t,qui(l,i-1),qui(i+1,r);
	return;
}
int main()
{
    int count;
	cin>>n>>c;
    for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])>=c)e[i*n-n+j].u=i,e[i*n-n+j].v=j,e[i*n-n+j].w=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]),m++;
    qui(1,m);
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++)
	{
		if(merge(e[i].u,e[i].v))
		{
			count++;
			sum+=e[i].w;
		}
		if(count==n-1)break;
	}
	if(count!=n-1)cout<<"-1";
	else cout<<sum;
	return 0;
}
WA on #3 #4 #5 #6 #7 #8 #9

回复

0 条回复,欢迎继续交流。

正在加载回复...