poj1984 Navigation Nightmare
阿新 • • 發佈:2020-08-23
題目連結: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; }