• 哈理工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 }
  • 相关阅读:
    PythonStudy——数据类型总结 Data type summary
    PythonStudy——可变与不可变 Variable and immutable
    PythonStudy——列表操作 List operatio
    PythonStudy——列表的常用操作 List of common operations
    PythonStudy——列表类型 List type
    PythonStudy——字符串扩展方法 String extension method
    PythonStudy——字符串重要方法 String important method
    AWT,Swing,RCP 开发
    JQuery插件机制
    最新知识网站
  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2514023.html
Copyright © 2020-2023  润新知