之前错是因为格式上少个换行符= =,我竟然没有发现...
#include<iostream>
#include<queue>
using namespace std;
int father[751],tnum,edged;;
struct town
{
int y,x;
int len;
friend bool operator < (const town &a,const town&b)
{
return a.len>b.len;
}
};
priority_queue<town > que;
int fine(int x)//压缩,只用压缩时间320
{
int r=x,j;
while(father[r]>0)
r=father[r];//r是根
while(r!=x)
{
j=father[x];
father[x]=r;
x=j;
}
return r;
}
void weightmerge(int x,int y)//只用折叠时间为280//折叠压缩一起用260
{
int temp;
int ix,iy;
ix=fine(x);
iy=fine(y);
temp=father[ix]+father[iy];
if(ix!=iy)
if(father[ix]>father[iy])//ix的结点少,以结点多的为父节点
{
father[iy]=temp;
father[ix]=iy;//iy为父指针
}
else
{
father[ix]=temp;
father[iy]=ix;//ix为父指针
}
}
void nroad()
{
town temp;
while(!que.empty())
{
for(int i=0;i<tnum;i++)
{
if((-father[i])==tnum-1-edged)
return;
}
temp=que.top();
que.pop();
if(fine(temp.x)==fine(temp.y))
continue;
weightmerge(temp.x,temp.y);
cout<<temp.x<<' '<<temp.y<<endl;
}
}
int main()
{
town t[750],temp;
int icase;
bool flag=false;
cin>>icase;
while(icase--)
{
if(flag)
cout<<endl;
flag=true;
int k=0;
cin>>tnum;
for(int i=1;i<=tnum;i++)
father[i]=-1;
while(!que.empty())
que.pop();
while(tnum--)
{
cin>>t[k].x>>t[k].y;
k++;
}
for(int i=0;i<k;i++)
for(int j=i+1;j<k;j++)
{
temp.len=(t[i].x-t[j].x)*(t[i].x-t[j].x)
+(t[i].y-t[j].y)*(t[i].y-t[j].y);
temp.x=i+1;
temp.y=j+1;
que.push(temp);
}
cin>>edged;
int re1,re2;
while(edged--)
{
cin>>re1>>re2;
weightmerge(re1,re2);
}
nroad();
}
}