poj 1984 并查集
题目意思是一个图中,只有上下左右四个方向的边。给出这样的一些边,
求任意指定的2个节点之间的距离。
就是看不懂,怎么破
/*
POJ 1984
并查集
*/ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std; const int MAXN=;
int F[MAXN];
int dx[MAXN],dy[MAXN]; int F1[MAXN],F2[MAXN],L[MAXN];
char D[MAXN][]; struct Node
{
int u,v;
int index;
int I;
}node[MAXN];
int ans[MAXN]; int find(int x)
{
if(F[x]==-)return x;
int tmp=find(F[x]);
dx[x]+=dx[F[x]];
dy[x]+=dy[F[x]];
return F[x]=tmp;
}
bool cmp(Node a,Node b)
{
return a.I<b.I;
}
int main()
{
int n,m;
int Q;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
while(scanf("%d%d",&n,&m)==)
{
memset(F,-,sizeof(F));
memset(dx,,sizeof(dx));
memset(dy,,sizeof(dy));
for(int i=;i<=m;i++)
{
scanf("%d%d%d%s",&F1[i],&F2[i],&L[i],&D[i]);
}
scanf("%d",&Q);
for(int i=;i<Q;i++)
{
scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].I);
node[i].index=i;
}
sort(node,node+Q,cmp);
int t=;
for(int i=;i<Q;i++)
{
while(t<=m&&node[i].I>=t)
{
int t1=find(F1[t]),t2=find(F2[t]);
if(t1!=t2)
{
F[t2]=t1;
if(D[t][]=='N')
{
dy[t2]=dy[F1[t]]-dy[F2[t]]+L[t];
dx[t2]=dx[F1[t]]-dx[F2[t]];
}
else if(D[t][]=='S')
{
dy[t2]=dy[F1[t]]-dy[F2[t]]-L[t];
dx[t2]=dx[F1[t]]-dx[F2[t]];
}
else if(D[t][]=='E')
{
dx[t2]=dx[F1[t]]-dx[F2[t]]+L[t];
dy[t2]=dy[F1[t]]-dy[F2[t]];
}
else if(D[t][]=='W')
{
dx[t2]=dx[F1[t]]-dx[F2[t]]-L[t];
dy[t2]=dy[F1[t]]-dy[F2[t]];
}
}
t++;
}
if(find(node[i].u)!=find(node[i].v))ans[node[i].index]=-;
else
{
ans[node[i].index]=abs(dx[node[i].u]-dx[node[i].v])+abs(dy[node[i].u]-dy[node[i].v]);
}
}
for(int i=;i<Q;i++)printf("%d\n",ans[i]);
}
return ;
}
poj 1984 并查集的更多相关文章
- poj 1797(并查集)
http://poj.org/problem?id=1797 题意:就是从第一个城市运货到第n个城市,最多可以一次运多少货. 输入的意思分别为从哪个城市到哪个城市,以及这条路最多可以运多少货物. 思路 ...
- POJ 2492 并查集扩展(判断同性恋问题)
G - A Bug's Life Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- POJ 2492 并查集应用的扩展
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...
- POJ 3228 [并查集]
题目链接:[http://poj.org/problem?id=3228] 题意:给出n个村庄,每个村庄有金矿和仓库,然后给出m条边连接着这个村子.问题是把所有的金矿都移动到仓库里所要经过的路径的最大 ...
- poj 1733 并查集+hashmap
题意:题目:有一个长度 已知的01串,给出多个条件,[l,r]这个区间中1的个数是奇数还是偶数,问前几个是正确的,没有矛盾 链接:点我 解题思路:hash离散化+并查集 首先我们不考虑离散化:s[x] ...
- poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...
- POJ 3657 并查集
题意: 思路: 1.二分+线段树(但是会TLE 本地测没有任何问题,但是POJ上就是会挂--) 2.二分+并查集 我搞了一下午+一晚上才搞出来----..(多半时间是在查错) 首先 如果我们想知道这头 ...
- poj 2236 并查集
并查集水题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring& ...
- poj 1417(并查集+简单dp)
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2087 Accepted: 640 Descrip ...
随机推荐
- LintCode题解之子树
思路: 最简单的方法,依次遍历比较就可以了. AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int va ...
- JavaScript三种绑定事件的方式
JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...
- CRF原理解读
概率有向图又称为贝叶斯网络,概率无向图又称为马尔科夫网络.具体地,他们的核心差异表现在如何求 ,即怎么表示 这个的联合概率. 概率图模型的优点: 提供了一个简单的方式将概率模型的结构可视化. 通过 ...
- Linux 添加普通用户到 sudoers 文件
前言 Linux 的普通用户(uid >= 500)不具有某些命令的执行权限,为了执行较高权限的命令,一般有两种方法: 第一种是使用 su - 命令切换到 root 用户去执行: 另外一种方法是 ...
- 实现在点击asp:button按钮后,不刷新当前页面
方法1:return false <asp:Button ID="Button1" runat="server" Text="Button&qu ...
- Django 1.10文档中文版Part1
目录 第一章.Django1.10文档组成结构1.1 获取帮助1.2 文档的组织形式1.3 第一步1.4 模型层1.5 视图层1.6 模板层1.7 表单1.8 开发流程1.9 admin站点1.10 ...
- go语言入门(一)
环境安装 Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Window 安装包下载地址为:https://golang.org/dl/. Windows ...
- Mybatis的初步使用
MyBatis 是当下最流行的持久层框架,也是ORM框架,本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google ...
- Zabbix定义报警机制
1. 修改zabbix配置文件 #取消注释或添加一行 cat -n /etc/zabbix/zabbix_server.conf |grep --color=auto "AlertScrip ...
- Jmeter组件和属性(二)
Jmeter脚本开发原则 简单.正确.高效.简单:去除无关的组件,同时能复用的尽量复用.正确:对脚本或者业务正确性进行必要的判断,不能少也不能多.(200),业务错误的情况下,也可能返回200,必须用 ...