社区讨论
球跳,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 条回复,欢迎继续交流。
正在加载回复...