哈理工oj 1418夏夜星空并查集解题报告

这道题和poj的食物链很像,要在路径压缩的过程中进行坐标的位置处理,要保存的是当前节点相对于父节点的相对坐标位置。合并的时候要考虑清楚两个父节点之间的坐标关系是什么

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define N 40005
 5 using namespace std;
 6 struct node
 7 {
 8     int p;
 9     int x,y;
10     int r;
11     int xd,yd;
12 };
13 int n;
14 node f[N];
15 void init()
16 {
17     int i;
18     for(i=1;i<=n;i++)
19     {
20         f[i].p=i;
21         f[i].x=f[i].y=f[i].r=f[i].xd=f[i].yd=0;
22     }
23 }
24 int find(int i)
25 {
26     if(i==f[i].p)
27     return i;
28     int temp=f[i].p;
29     f[i].p=find(temp);
30     f[i].x=f[temp].x+f[i].xd;//路径压缩时进行坐标位置处理,xd,yd为相对父节点的坐标位置
31     f[i].y=f[temp].y+f[i].yd;
32     f[i].xd=f[i].x;
33     f[i].yd=f[i].y;
34     return f[i].p;
35 }
36 void uni(int i,int j,int dir,int len)
37 {
38     int t1=find(i);
39     int t2=find(j);
40     //printf("%d %d\n",dir,len);
41     f[t2].p=t1;
42     if(dir==1)//合并时两个父节点的相对位置
43     {
44         f[t2].xd=f[i].x-f[j].x;
45         f[t2].yd=f[i].y+len-f[j].y;
46     }
47     else if(dir==2)
48     {
49         f[t2].xd=f[i].x-f[j].x;
50         f[t2].yd=f[i].y-len-f[j].y;
51     }
52     else if(dir==3)
53     {
54         f[t2].xd=f[i].x+len-f[j].x;
55         f[t2].yd=f[i].y-f[j].y;
56     }
57     else
58     {
59         f[t2].xd=f[i].x-len-f[j].x;
60         f[t2].yd=f[i].y-f[j].y;
61     }
62 }
63 int main()
64 {
65     int s[26];
66     s['U'-'A']=1;
67     s['D'-'A']=2;
68     s['R'-'A']=3;
69     s['L'-'A']=4;
70     char s2[100];
71     char s3[10];
72     int m,i,j,a,b,len;
73     while(scanf("%d%d",&n,&m)!=EOF)
74     {
75         init();
76         while(m--)
77         {
78             scanf("%s",s2);
79             if(s2[0]=='Q')
80             {
81                 scanf("%d %d",&a,&b);
82                 if(find(a)==find(b))
83                 printf("%d\n",abs(f[a].x-f[b].x)+abs(f[a].y-f[b].y));
84                 else
85                 printf("-1\n");
86             }
87             else if(s2[0]=='A')
88             {
89                 scanf("%d %d %d %s",&a,&b,&len,s3);
90                 uni(a,b,s[s3[0]-'A'],len);
91                 //printf("%d %s\n",m,s2);
92             }
93         }
94     }
95     return 0;
96 }
原文地址:https://www.cnblogs.com/caozhenhai/p/2514023.html