暴力解决方法,没考虑优化时间,仅仅是暴力实现,数据量很大的话会超时。
#include<bits/stdc++.h>
using namespace std;
int n,k;
struct Node{
int x,y;
int id;
};
struct Node nodes[1005];
vector<struct Node> cu[1005];
double dis(int x,int y)
{
return sqrt((nodes[x].x-nodes[y].x)*(nodes[x].x-nodes[y].x)+(nodes[x].y-nodes[y].y)*(nodes[x].y-nodes[y].y));
}
bool cmp(vector<struct Node> x,vector<struct Node> y)
{
return x.size()<y.size();
}
bool cmp1(vector<struct Node> x,vector<struct Node> y)
{
return x.size()>y.size();
}
bool cmp2(struct Node x,struct Node y)
{
return x.id<
y.id;
}
void Agnes()
{
int N=n;
while(N>k)
{
double mindis=9999;
int tar1=-1,tar2=-1;
for(int i=0;i<n;i++)
{
if(!cu[i].empty())
for(int j=i+1;j<n;j++)
{
if(!cu[j].empty())
for(int m=0;m<cu[i].size();m++)
{
for(int n=0;n<cu[j].size();n++)
{
double tempdis=dis(cu[i][m].id,cu[j][n].id);
if(mindis>tempdis)
{
mindis=tempdis;
tar1=i;
tar2=j;
}
}
}
}
}
for(int i=0;i<cu[tar2].size();i++)
{
struct Node temp=cu[tar2][i];
cu[tar1].push_back(temp);
}
cu[tar2].clear();
sort(cu,cu+n,cmp);
int cnt=0;
for(int i=0;i<n;i++)
if(!cu[i].empty())
cnt++;
N=cnt;
}
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>nodes[i].x>>nodes[i].y;
nodes[i].id=i;
cu[i].push_back(nodes[i]);
}
Agnes();
sort(cu,cu+n,cmp1);
for(int i=0;i<n;i++)
if(!cu[i].empty())
{
sort(cu[i].begin(),cu[i].end(),cmp2);
for(int j=0;j<cu[i].size();j++)
if(j==0)
cout<<"{"<<cu[i][j].id+1<<" ";
else if(j==cu[i].size()-1)
cout<<cu[i][j].id+1<<"}"<<endl;
else
cout<<cu[i][j].id+1<<" ";
if(cu[i].size()==1)
cout<<"}"<<endl;
}
return 0;
}