简单的并查集的题目
最好自己写
看题解没意思
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#define maxn 1111
using namespace std;
float line[maxn][5];
int l;
int fa[maxn];
int big[maxn];
int seek(int x)
{
return fa[x]==x?x:fa[x]=seek(fa[x]);
}
void Merge(int u ,int v)
{
int fu = seek(u);
int fv = seek(v);
if(fu != fv) {
fa[fv] = fu ;
big[fu] += big[fv];
big[fv] = 0 ;
}
}
float pos(float x1,float y1,float x2,float y2,float x,float y)
{
return y-(y2-y1)/(x2-x1)*(x-x1)-y1;
}
void cross(float x1,float y1,float x2,float y2)
{
int i;
for(i=1;i<l;i++)
if(pos(line[i][0],line[i][1],line[i][2],line[i][3],x1,y1)*pos(line[i][0],line[i][1],line[i][2],line[i][3],x2,y2)<=0)
if(pos(x1,y1,x2,y2,line[i][0],line[i][1])*pos(x1,y1,x2,y2,line[i][2],line[i][3])<=0)
{
Merge(l,i);
}
// return -1;
}
void init()
{
int i;
for(i=0;i<maxn;i++)
fa[i]=i;
}
int main()
{
int t,n,i;
char com;
int num;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
l=1;
for(i=0;i<maxn;i++)
big[i]=1;
init();
i=0;
while(i<n)
{
scanf("%c",&com);
if(com=='Q')
{
scanf("%d",&num);
int nn=seek(num);
printf("%d\n",big[nn]);
//printf("--------------\n");
i++;
}
else if (com=='P')
{
scanf("%f%f%f%f",&line[l][0],&line[l][1],&line[l][2],&line[l][3]);
cross(line[l][0],line[l][1],line[l][2],line[l][3]);
l++;
i++;
}
// printf("--------------\n");
}
// system("pause");
if(t!=0)printf("\n");
}
return 0;
}