33,008
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <cmath>
using namespace std;
class datatype //点的类型
{public:
int fx;
int fy;
int parent; //父节点
};
class querytype //查询数据类型
{public:
int x;
int y;
};
class result //当前所选节点类型
{public:
double mol; //分子 f(y)-f(x)
double deno; //分母 g(y)-g(x)
int k; //当前所选节点号
};
int find(datatype *T,int i) //并查集查询父节点
{
while(T[i].parent!=i){i=T[i].parent;}
return i;
}
void f(datatype *T,querytype *Q,int n,int k)
{
result min; //当前最优值
for (int i=0;i<=n-1;++i)
{
min.deno=0; //初始化分母
min.k=i; //初始化连接点编号
for (int j=0;j<=n-1;++j)
{
if (j!=i)
{
double mo1_t=T[j].fx-T[i].fx; //当前分子
double deno_t=T[j].fy-T[i].fy; //当前分母
if (mo1_t/deno_t<0) //D<0返回继续查找
{
continue;
}
if (min.deno==0) //min未设值
{
min.mol=mo1_t;
min.deno=deno_t;
min.k=j;
continue;
}
if (min.mol/min.deno>mo1_t/deno_t) //当前D小于min.D,更新
{
min.mol=mo1_t;
min.deno=deno_t;
min.k=j;
continue;
}
if (min.mol/min.deno==mo1_t/deno_t) //当前d等于min.d
{
if (abs(min.mol)>abs(mo1_t)) //当前分子绝对值小于min.mol
{
min.mol=mo1_t;
min.deno=deno_t;
min.k=j;
}
else if(abs(mo1_t)==abs(min.mol)&&mo1_t>0)//当前分子绝对
{ 值等于min.mol
min.mol=mo1_t; 且mol_t>0
min.deno=deno_t;
min.k=j;
}
continue;
}
}
}
T[i].parent=find(T,min.k); //找到可连接点的父节点,并查集操作
}
for (int i=0;i<=k-1;++i)
{
if(find(T,Q[i].x)!=find(T,Q[i].y))
{
cout<<"no"<<endl;
}
else
cout<<"yes"<<endl;
}
}
int main()
{
int n;
int k;
cin>>n>>k;
datatype *T=new datatype[n];
for (int i=0;i<=n-1;++i)
{
cin>>T[i].fx;
cin>>T[i].fy;
T[i].parent=i;
}
querytype *Q=new querytype[k];
for (int i=0;i<=k-1;++i)
{
cin>>Q[i].x;
cin>>Q[i].y;
}
f(T,Q,n,k);
system("pause");
return 0;
}