Navigation Nightmare(并查集(多权值更新))
来源:互联网 发布:淘宝魔镜插件免费版 编辑:程序博客网 时间:2024/06/08 11:13
题目来源:https://vjudge.net/problem/POJ-1984
【题意】
农夫约翰有 N 个农场,标号 1 到 N,M 条的不同的垂直或水平的道路连接着农场,道路的长度不超过 1000。
【思路】
权值分为x,y轴方向上,更新当前节点到根节点的权值。
【代码】
#include<map>#include<stack>#include<queue>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<iostream>#include<string>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long LL;const int N1=40010;const int N2=10010;int pre[N1];int rx[N1],ry[N1];struct p1{ int x1,x2,dis; char s;} st[N1];struct p2{ int x,y,d,num; friend bool operator<(const p2&a,const p2&b) { return a.d<b.d; }} query[N2];int sum[N2];int n,m;int find(int x){ if(pre[x]!=x) { int fx=find(pre[x]); rx[x]+=rx[pre[x]]; ry[x]+=ry[pre[x]]; pre[x]=fx; } return pre[x];}int cmp(int aq,int bq){ return query[aq].num<query[bq].num;}int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=1; i<=n; i++) pre[i]=i, rx[i]=ry[i]=0; for(int i=1; i<=m; i++) scanf("%d%d%d%*c%c",&st[i].x1,&st[i].x2,&st[i].dis,&st[i].s); int k; scanf("%d",&k); for(int i=0; i<k; i++) scanf("%d%d%d",&query[i].x,&query[i].y,&query[i].d),query[i].num=i; sort(query,query+k); int j=1; for(int i=0; i<k; i++) { for(; j<=query[i].d; j++) { int fx1=find(st[j].x1),fx2=find(st[j].x2); if(fx1!=fx2) { pre[fx2]=fx1; if(st[j].s=='E') rx[fx2]=rx[st[j].x1]+st[j].dis-rx[st[j].x2],ry[fx2]=ry[st[j].x1]-ry[st[j].x2]; else if(st[j].s=='W') rx[fx2]=rx[st[j].x1]-st[j].dis-rx[st[j].x2],ry[fx2]=ry[st[j].x1]-ry[st[j].x2]; else if(st[j].s=='N') ry[fx2]=ry[st[j].x1]+st[j].dis-ry[st[j].x2],rx[fx2]=rx[st[j].x1]-rx[st[j].x2]; else if(st[j].s=='S') ry[fx2]=ry[st[j].x1]-st[j].dis-ry[st[j].x2],rx[fx2]=rx[st[j].x1]-rx[st[j].x2]; } } int fxa=find(query[i].x); int fxb=find(query[i].y); sum[query[i].num]=fxa==fxb?(abs(rx[query[i].x]-rx[query[i].y])+abs(ry[query[i].x]-ry[query[i].y])):-1; } for(int i=0; i<k; i++) printf("%d\n",sum[i]); }}
0 0
- Navigation Nightmare(并查集(多权值更新))
- POJ1984 Navigation Nightmare(并查集)
- POJ 1984 Navigation Nightmare (数据结构-并查集)
- POJ 1984 Navigation Nightmare(加权并查集)
- poj1984 Navigation Nightmare(带权并查集)
- POJ 1984 Navigation Nightmare (带权并查集)
- poj 1984 Navigation Nightmare(带权并查集)
- 【POJ 1984】Navigation Nightmare (并查集)
- POJ--1984-Navigation Nightmare--并查集
- poj 1984 - Navigation Nightmare(并查集)
- poj1984 Navigation Nightmare(并查集)
- POJ 1984 Navigation Nightmare 并查集
- POJ 1984 Navigation Nightmare(并查集坐标偏移)#by zh
- bzoj 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦(加权并查集)
- [BZOJ3362][Usaco2004 Feb]Navigation Nightmare 导航噩梦(加权并查集)
- PKU 1984 Navigation Nightmare dfs+并查集
- POJ 1984 Navigation Nightmare【并查集思路总结】
- poj 1984 Navigation Nightmare(带权并查集)
- PostgreSQL学习手册(常用数据类型)
- linux命令之sync
- 微信小程序map地图整理
- 常见算法
- webView设置Cookie
- Navigation Nightmare(并查集(多权值更新))
- Android RxJava详解(二)
- centos6.5下使用yum完美搭建LNMP环境(php5.6)
- idea关于tomcat发布项目与eclipse的不同
- Ceilometer原理及介绍
- Informatics Training
- unity 定位服务GPS API
- bulid签名apk出错
- 如何重置CentOS 7的Root密码