hdu1558 Segment set

来源:互联网 发布:淘宝版权投诉 编辑:程序博客网 时间:2024/05/16 23:37
#include<stdio.h>#include <stdlib.h>#define MAXN 1005int father[MAXN],num[MAXN];typedef struct node{double x,y;}point;struct edge{point p1;point p2;} seg[MAXN];double Max(double x,double y){return x>y?x:y;}double Min(double x,double y){return x<y?x:y;}int find(int x){//带路径压缩的查找算法int i,r;r=x;while(r!=father[r])//循环结束,则找到根节点r=father[r];i=x;while(i!=r)//本循环修改查找路径中所有节点{int j=father[i];father[i]=r;i=j;}return r;}void Union(int x,int y){int fx=find(x);int fy=find(y);if (fx!=fy){father[fx]=fy;num[fy]+=num[fx];}}double mult(point a,point b,point c){return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}int onSegment(point a,point b,point c){if(c.x>=Min(a.x,b.x)&&c.x<=Max(a.x,b.x)&&c.y>=Min(a.y,b.y)&&c.y<=Max(a.y,b.y))return 1;elsereturn 0;}int segCross(point a,point b,point c,point d){double d1,d2,d3,d4;d1=mult(c,d,a);d2=mult(c,d,b);d3=mult(a,b,c);d4=mult(a,b,d);// printf("*****%lf %lf %lf %lf\n",d1,d2,d3,d4);if(d1*d2<0&&d3*d4<0)  return 1;else  if(d1==0&&onSegment(c,d,a)) return 1;else  if(d2==0&&onSegment(c,d,b)) return 1;else  if(d3==0&&onSegment(a,b,c)) return 1;else  if(d4==0&&onSegment(a,b,d)) return 1;return 0;}int main(){int t,n,i,j,s,k;char ch;scanf("%d",&t);while(t--){k=0;scanf("%d",&n);for (i=1; i<=n; i++){father[i]=i;num[i]=1;}for (i=1; i<=n; i++){getchar();scanf("%c",&ch);if(ch=='P'){k++;scanf("%lf %lf %lf %lf",&seg[k].p1.x,&seg[k].p1.y,&seg[k].p2.x,&seg[k].p2.y);for (j=1; j<k; j++){if((find(k)!=find(j))&&(segCross(seg[k].p1,seg[k].p2,seg[j].p1,seg[j].p2)))Union(k,j);}}else if(ch=='Q'){scanf("%d",&s);printf("%d\n",num[find(s)]);}}if(t)printf("\n");}return 0;}