码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1558:Segment set

时间:2015-08-06 22:36:11      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

简单的并查集的题目

最好自己写

看题解没意思


#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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 1558:Segment set

标签:

原文地址:http://blog.csdn.net/whereyousink/article/details/47322229

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!