zoukankan      html  css  js  c++  java
  • 哈理工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 }
  • 相关阅读:
    使用mybatis插入自增主键ID的数据后返回自增的ID
    CentOS 配置阿里云 yum 源
    Zabbix监控ActiveMQ
    wget下载阿里云oss的文件报错403
    Zabbix-proxy和Zabbix-agent源码安装
    Zabbix 设置自动添加主机两种方法(自动注册、自动发现)
    Zabbix邮件预警-这个坑我跳了不止一次
    AWS云创建EC2与使用注意事项-踩坑记录
    Zabbix图表中文乱码(包含Docker安装乱码)
    Zabbix server 更改数据库密码
  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2514023.html
Copyright © 2011-2022 走看看