带权并查集
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int f[40010];
int s1[40010],s2[40010]; //s1为水平,s2为竖直
int ans[10010];
struct Road{
int u,v,c;
char dir;
}road[40010];
struct Query{
int u,v,id;
int num;
}query[10010];
void init(int n){
for(int i=1;i<=n;i++){
f[i]=i;
s1[i]=s2[i]=0;
}
}
bool cmp(Query a,Query b){
return a.id<b.id;
}
int find(int u){
if(f[u]!=u){
int tem=f[u];
f[u]=find(tem);
s1[u]+=s1[tem];
s2[u]+=s2[tem];
}
return f[u];
}
void Union(int i){
int u=find(road[i].u);
int v=find(road[i].v);
if(u!=v){
f[u]=v;
if(road[i].dir=='E'){
s1[u]=-s1[road[i].u]+road[i].c+s1[road[i].v];
s2[u]=-s2[road[i].u]+s2[road[i].v];
}
else if(road[i].dir=='W'){
s1[u]=-s1[road[i].u]-road[i].c+s1[road[i].v];
s2[u]=-s2[road[i].u]+s2[road[i].v];
}
else if(road[i].dir=='N'){
s1[u]=-s1[road[i].u]+s1[road[i].v];
s2[u]=-s2[road[i].u]+road[i].c+s2[road[i].v];
}
else if(road[i].dir=='S'){
s1[u]=-s1[road[i].u]+s1[road[i].v];
s2[u]=-s2[road[i].u]-road[i].c+s2[road[i].v];
}
}
}
int main(){
int n,m,i,j,k;
int now,u,v;
char dir;
scanf("%d %d",&n,&m);
init(n);
for(i=1;i<=m;i++)
scanf("%d %d %d %c",&road[i].u,&road[i].v,&road[i].c,&road[i].dir);
scanf("%d",&k);
for(i=1;i<=k;i++){
scanf("%d %d %d",&query[i].u,&query[i].v,&query[i].id);
query[i].num=i;
}
sort(query+1,query+1+k,cmp);
now=1;
for(i=1;i<=m;i++){
Union(i);
while(query[now].id==i && now<=k){
u=find(query[now].u);
v=find(query[now].v);
if(u==v)
ans[query[now].num]=abs(s1[query[now].u]-s1[query[now].v])+abs(s2[query[now].u]-s2[query[now].v]);
else
ans[query[now].num]=-1;
now++;
}
if(now==k+1)
break;
}
for(i=1;i<=k;i++)
printf("%d\n",ans[i]);
return 0;
}