博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1984 Navigation Nightmare (并查集)
阅读量:6048 次
发布时间:2019-06-20

本文共 1585 字,大约阅读时间需要 5 分钟。

    题目描述的如此蛋疼。。。

    关系并查集,用cx和cy数组记录点与根结点的相对位置,然后根据输入依次合并,当碰到询问时便计算距离,若不在同一集合中,即无法确定相对位置。

code:

#include<cstdio>
#include<cstring>
int p[
40001], cx[
40001], cy[
40001] ;
int f1[
10001], f2[
10001], fi[
10001] ;
struct edge{
    
int s, e, l ;
    
char d ;
}q[
40001] ;
int abs(
int a){
    
return a>
0?a:-a ;
}
void make_set(
int n){
    
for(
int i=
0; i<=n+
1; i++){
        p[i] = i ;
        cx[i] = cy[i] = 
0 ;
    }
}
int find_set(
int x){
    
int temp ;
    
if(x!=p[x]){
        temp = p[x] ;
        p[x] = find_set(p[x]) ;
        cx[x] = cx[temp] + cx[x] ;
        cy[x] = cy[temp] + cy[x] ;
    }
    
return p[x] ;
}
void union_set(
int x){
    
int a = q[x].s ;
    
int b = q[x].e ;
    
int pa = find_set(a) ;
    
int pb = find_set(b) ;
    p[pb] = pa ;
    cx[pb] = cx[a] - cx[b] ;
    cy[pb] = cy[a] - cy[b] ;
    
switch(q[x].d){
        
case 
'
E
':cx[pb] += q[x].l ;
break ;
        
case 
'
W
':cx[pb] -= q[x].l ;
break ;
        
case 
'
N
':cy[pb] += q[x].l ;
break ;
        
case 
'
S
':cy[pb] -= q[x].l ;
break ;
    }
    
return ;
}
int main(){
    
int n, m, k, i, j, t, x, y, z, tx, ty ;
    
while(~scanf(
"
%d%d
", &n, &m)){
        make_set(n) ;
        
for(i=
1; i<=m; i++)
            scanf(
"
%d %d %d %c
", &q[i].s, &q[i].e, &q[i].l, &q[i].d) ;
        scanf(
"
%d
", &t) ;
        
for(i=
0; i<t; i++)
            scanf(
"
%d%d%d
", &f1[i], &f2[i], &fi[i]) ;
        
int temp = 
0 ;
        
for(i=
1; i<=m; i++){
            tx = find_set(q[i].s) ;
            ty = find_set(q[i].e) ;
            
if(tx!=ty)
                union_set(i) ;
            
while(fi[temp]==i){
                tx = find_set(f1[temp]) ;
                ty = find_set(f2[temp]) ;
                
if(tx!=ty)  printf(
"
-1\n
") ;
                
else{
                    tx = abs(cx[f1[temp]] - cx[f2[temp]]) ;
                    ty = abs(cy[f1[temp]] - cy[f2[temp]]) ;
                    printf(
"
%d\n
", tx + ty) ;
                }
                temp ++ ;
            }
        }
    }
    
return 
0 ;}

 

转载于:https://www.cnblogs.com/xiaolongchase/archive/2012/04/21/2462393.html

你可能感兴趣的文章
ceph - adding A monitor (MANUAL)
查看>>
MYSQL的慢查询分析
查看>>
Go系统下的自定义属性文件的增删改查
查看>>
mysql一些比较冷门的查询
查看>>
MapXtreme 2005 学习心得 工具(六)
查看>>
查找大文件?
查看>>
Java输入输出流
查看>>
python中实现sftp
查看>>
第四课 单用户、救援模式及linux机器相互登陆,虚拟机的克隆
查看>>
软考信息系统监理师,2016年3月18日(冬青子)的作业:
查看>>
Nginx之location 匹配规则详解
查看>>
MySQL 存储过程和函数
查看>>
Python使用pip安装第三方库时出现UnicodeError的解决办法(Windows平台下)
查看>>
通过hadoopAPI访问文件
查看>>
配置Tomcat监听80端口
查看>>
来看看Cap’n Proto’s的神器力量,让你的数据飞起来传输
查看>>
shell逻辑判断
查看>>
UITableViewCell 左滑 多个按钮
查看>>
Confluence 6 重新获得附件指南
查看>>
shell基础知识(2)
查看>>