#include<cstdio>
#include<algorithm>
#include<cmath>
#define MAX_N 40010
using namespace std;
int ex[MAX_N],ey[MAX_N],pre[MAX_N],n,m;
void init()
{
for(int i=0;i<MAX_N;i++)
{
pre[i]=i;
ex[i]=0;
ey[i]=0;
}
}
int find(int x)
{
int now;
if(x==pre[x])
return x;
now=pre[x];
pre[x]=find(pre[x]);
ex[x]+=ex[now];
ey[x]+=ey[now];
return pre[x];
}
void unite(int a,int b,int x,int y)
{
int t1=find(a);
int t2=find(b);
if(t1!=t2)
{
pre[t2]=t1;
ex[t2]=ex[a]-ex[b]+x;
ey[t2]=ey[a]-ey[b]+y;
}
}
int main()
{
int Q,dx[MAX_N],dy[MAX_N],f[MAX_N],e[MAX_N],v[MAX_N];
char str[100];
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++)
{
scanf("%d%d%d%s",&f[i],&e[i],&v[i],&str);
switch(str[0])
{
case'N':dx[i]-=v[i];dy[i]=0;break;
case'S':dx[i]+=v[i];dy[i]=0;break;
case'E':dx[i]=0;dy[i]+=v[i];break;
case'W':dx[i]=0;dy[i]-=v[i];break;
}
}
int now=0;
scanf("%d",&Q);
while(Q--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(int i=now;i<c;i++)
{
unite(f[i],e[i],dx[i],dy[i]);
}
now=c;
if(find(a)!=find(b))
printf("-1\n");
else
printf("%d\n",abs(ex[a]-ex[b])+abs(ey[a]-ey[b]));
}
}
poj 1984 (并查集 更新各点的相对位置)
最新推荐文章于 2020-09-18 16:14:14 发布