poj1984 Navigation Nightmare

题目链接:https://vjudge.net/problem/POJ-1984#author=1838641320

简单题意:相比较原题,这个链接里写的很清楚......

这个其实基本是裸的带权并查集,只是要多维护一个方向的权值而已。注意距离的相对性不要弄反了,最后如果询问的点不在同一个集合就输出-1,否则输出水平和竖直方向,距离绝对值的和

#include<iostream>
#include<algorithm>
#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

const int maxn=40000+10;
struct st{int x,y,d;char ch;}r[maxn];
int fa[maxn],vx[maxn],vy[maxn]; 
int n,m,i,j,k,dx,dy;

int find(int x){
	if (fa[x]!=x){
	  int p=fa[x];
	  fa[x]=find(fa[x]);
	  vx[x]+=vx[p]; vy[x]+=vy[p];
	}
	return fa[x];
} 

int main(){
	IOS; cin>>n>>m;
	for (i=1;i<=n;i++) fa[i]=i; j=1;
	for (i=1;i<=m;i++) cin>>r[i].x>>r[i].y>>r[i].d>>r[i].ch;
	cin>>k; 
	for (i=1;i<=k;i++){
	  int u,v,q; 
	  cin>>u>>v>>q;
	  while (j<=q){
	  	if (r[j].ch=='N'||r[j].ch=='S')
		{dy=(r[j].ch=='N')?-r[j].d:r[j].d; dx=0;}
		else {dx=(r[j].ch=='E')?-r[j].d:r[j].d; dy=0;}
		int fx=find(r[j].x); int fy=find(r[j].y);
		fa[fx]=fy;
		vx[fx]=vx[r[j].y]+dx-vx[r[j].x];
		vy[fx]=vy[r[j].y]+dy-vy[r[j].x];
		j++;
	  }
	  int fu=find(u); int fv=find(v);
	  int ans=abs(vx[u]+vx[fu]-vx[v])+abs(vy[u]+vy[fu]-vy[v]);
	  if (fu==fv) cout<<ans<<endl; else cout<<-1<<endl;  
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/edmunds/p/13549607.html