HDu 1558(線分交差+並列調査セット)

12136 ワード

タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1558
考え方:主に線分の交差を判断し、交差すれば合併し、sum値を修正すればよい.

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<cmath>

 6 using namespace std;

 7 #define MAXN 1111

 8 #define eps 1e-7

 9 int parent[MAXN];

10 int sum[MAXN];

11 int n;

12 struct Node{

13     double x1,y1,x2,y2;

14 }node[MAXN];

15 

16 void Initiate()

17 {

18     for(int i=1;i<=n;i++){

19         parent[i]=i;

20         sum[i]=1;

21     }

22 }

23 

24 int Find(int x)

25 {

26     if(x==parent[x])

27         return x;

28     parent[x]=Find(parent[x]);

29     return parent[x];

30 }

31 

32 void Union(int u,int v)

33 {

34     int r1=Find(u),r2=Find(v);

35     if(r1==r2)return ;

36     parent[r1]=r2;

37     sum[r2]+=sum[r1];

38 }

39 

40 double Multiply1(const Node &p,const Node &q)

41 {

42     return (p.x1-p.x2)*(q.y1-p.y1)-(p.y1-p.y2)*(q.x1-p.x1);

43 }

44 

45 double Multiply2(const Node &p,const Node &q)

46 {

47     return (p.x1-p.x2)*(q.y2-p.y1)-(p.y1-p.y2)*(q.x2-p.x1);

48 }

49 

50 bool Judge(const Node &p,const Node &q)

51 {

52     if(max(p.x1,p.x2)>=min(q.x1,q.x2)&&

53     max(q.x1,q.x2)>=min(p.x1,p.x2)&&

54     max(p.y1,p.y2)>=min(q.y1,q.y2)&&

55     max(q.y1,q.y2)>=min(p.y1,p.y2)&&

56     Multiply1(p,q)*Multiply2(p,q)<=eps&&

57     Multiply1(q,p)*Multiply2(q,p)<=eps)

58     return true;

59     else return false;

60 }

61 

62 

63 int main()

64 {

65     int _case,i,x,t=0;

66     char str[2];

67     scanf("%d",&_case);

68     while(_case--)

69     {

70         if(t++)puts("");

71         scanf("%d",&n);

72         Initiate();

73         i=1;

74         while(n--){

75             scanf("%s",str);

76             if(str[0]=='P'){

77                 scanf("%lf%lf%lf%lf",&node[i].x1,&node[i].y1,&node[i].x2,&node[i].y2);

78                 for(int j=1;j<i;j++){

79                     if(Judge(node[j],node[i])){

80                         Union(j,i);

81                     }

82                 }

83                 i++;

84             }else {

85                 scanf("%d",&x);

86                 x=Find(x);

87                 printf("%d
",sum[x]); 88 } 89 } 90 } 91 return 0; 92 }

View Code