Description
F1 --- (13) ---- F6 --- (9) ----- F3 | | (3) | | (7) F4 --- (20) -------- F2 | | | (2) F5 | F7
Input
* Line 1: Two space-separated integers: N and M * Lines 2..M+1: Each line contains four space-separated entities, F1, F2, L, and D that describe a road. F1 and F2 are numbers of two farms connected by a road, L is its length, and D is a character that is either 'N', 'E', 'S', or 'W' giving the direction of the road from F1 to F2. * Line M+2: A single integer, K (1 <= K <= 10,000), the number of FB's queries * Lines M+3..M+K+2: Each line corresponds to a query from Farmer Bob and contains three space-separated integers: F1, F2, and I. F1 and F2 are numbers of the two farms in the query and I is the index (1 <= I <= M) in the data after which Bob asks the query. Data index 1 is on line 2 of the input data, and so on.
Output
* Lines 1..K: One integer per line, the response to each of Bob's queries. Each line should contain either a distance measurement or -1, if it is impossible to determine the appropriate distance.
Sample Input
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 3 1 6 1 1 4 3 2 6 6
Sample Output
13 -1 10
Hint
Source
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int MAX=40000+10; int par[MAX]; int dx[MAX]; int dy[MAX]; struct node1 { int st,en,dis; char dir[5]; }road[MAX]; struct node2 { int s,e,in,ans,seq; }query[MAX]; bool cmp1(node2 a,node2 b) { return a.in<b.in; } bool cmp2(node2 a,node2 b) { return a.seq<b.seq; } int Get_par(int a) //查找a的父亲节点并压缩路径 { if(par[a]==a) return par[a]; //注意语句的顺序 int pa=par[a]; par[a]=Get_par(par[a]); dx[a]+=dx[pa],dy[a]+=dy[pa];/// return par[a]; } void Merge1(int a,int b,int dis) //合并a,b { int pa,pb; pa=Get_par(a); pb=Get_par(b); dx[pa]=-dx[a]+dis+dx[b];// dy[pa]=dy[b]-dy[a]; par[pa]=pb; } void Merge2(int a,int b,int dis) //合并a,b { int pa,pb; pa=Get_par(a); pb=Get_par(b); dy[pa]=-dy[a]+dis+dy[b];// dx[pa]=dx[b]-dx[a]; par[pa]=pb; } int main() { int i,m,k,n,ind,j; char ch; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) par[i]=i,dx[i]=0,dy[i]=0; for(i=1;i<=m;i++) { scanf("%d%d%d%s",&road[i].st,&road[i].en,&road[i].dis,road[i].dir); // printf("%d %d %d %c\n",road[i].st,road[i].en,road[i].dis,road[i].dir); } scanf("%d",&k); for(i=1;i<=k;i++) { scanf("%d%d%d",&query[i].s,&query[i].e,&query[i].in); query[i].seq=i; } sort(query+1,query+k+1,cmp1); j=1; for(i=1;i<=k;i++) { while(j<=m&&j<=query[i].in) { int pss=Get_par(road[j].st); int pee=Get_par(road[j].en); if(pss!=pee) { if(road[j].dir[0]=='E') Merge1(road[j].st,road[j].en,road[j].dis); else if(road[j].dir[0]=='W') Merge1(road[j].st,road[j].en,-road[j].dis); else if(road[j].dir[0]=='N') Merge2(road[j].st,road[j].en,road[j].dis); else if(road[j].dir[0]=='S') Merge2(road[j].st,road[j].en,-road[j].dis); } j++; } int ps=Get_par(query[i].s); int pe=Get_par(query[i].e); if(ps!=pe) query[i].ans=-1; else { int disx,disy; disx=abs(dx[query[i].s]-dx[query[i].e]); disy=abs(dy[query[i].s]-dy[query[i].e]); query[i].ans=disx+disy; } } sort(query+1,query+k+1,cmp2); for(i=1;i<=k;i++) printf("%d\n",query[i].ans); } return 0; }