题目链接: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; }