hdu 1558:Segment set

来源:互联网 发布:淘宝运营常用软件 编辑:程序博客网 时间:2024/06/06 00:41

简单的并查集的题目

最好自己写

看题解没意思


#include<stdio.h>#include<string.h>#include<algorithm>#include<map>#define maxn 1111using 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;}


0 0