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;
}

浙公网安备 33010602011771号