注意,题目中说的是|x1-x2|….不要弄成加了。。。。
然后超时的话,可能是你的询问的时候,每次都从0开始的。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 40005;
struct node
{
int from,to,dist,op;
}a[maxn];
int dis[maxn];
struct point
{
int e,n;
}val[maxn];
int fx[10]={1,-1,1,-1};
int findf(int k)
{
if(k==dis[k]) return k;
else {
int t=dis[k];
dis[k]=findf(dis[k]);
val[k].e=val[k].e+val[t].e;
val[k].n=val[k].n+val[t].n;
}
return dis[k];
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<=n;i++)
{
dis[i]=i;
val[i].e=val[i].n=0;
}
char s[10];
for(int i=0;i<m;i++)
{
scanf("%d %d %d %s",&a[i].from,&a[i].to,&a[i].dist,s);
if(s[0]=='E') a[i].op=0;
else if(s[0]=='W') a[i].op=1;
else if(s[0]=='N') a[i].op=2;
else a[i].op=3;
}
int q;
scanf("%d",&q);
int i=0;
while(q--)
{
int u,v,k;
scanf("%d %d %d",&u,&v,&k);
for(;i<k;i++)//这里i不能从0开始,会超时
{
int root1=findf(a[i].from);
int root2=findf(a[i].to);
if(root1!=root2)
{
dis[root2]=root1;
val[root2].e=val[a[i].from].e-val[a[i].to].e+a[i].dist*fx[a[i].op]*(a[i].op<2?1:0);
// val[root2].w=val[a[i].from].w-(val[a[i].to].w-a[i].dist*(a[i].op==1?1:0));
val[root2].n=val[a[i].from].n-val[a[i].to].n+a[i].dist*fx[a[i].op]*(a[i].op>1?1:0);
//val[root2].s=val[a[i].from].s-(val[a[i].to].s-a[i].dist*(a[i].op==3?1:0));
}
}
int root1=findf(u);
int root2=findf(v);
if(root1!=root2)
{
printf("-1\n");
}
else {
printf("%d\n",(int)(abs(val[u].e-val[v].e)+abs(val[u].n-val[v].n)));///这里是减。。
}
}
return 0;
}