Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 3167 | Accepted: 1317 | |
Case Time Limit: 1000MS |
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
/* POJ 1984 并查集 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; const int MAXN=40010; int F[MAXN]; int dx[MAXN],dy[MAXN]; int F1[MAXN],F2[MAXN],L[MAXN]; char D[MAXN][3]; struct Node { int u,v; int index; int I; }node[MAXN]; int ans[MAXN]; int find(int x) { if(F[x]==-1)return x; int tmp=find(F[x]); dx[x]+=dx[F[x]]; dy[x]+=dy[F[x]]; return F[x]=tmp; } bool cmp(Node a,Node b) { return a.I<b.I; } int main() { int n,m; int Q; while(scanf("%d%d",&n,&m)==2) { memset(F,-1,sizeof(F)); memset(dx,0,sizeof(dx)); memset(dy,0,sizeof(dy)); for(int i=1;i<=m;i++) { scanf("%d%d%d%s",&F1[i],&F2[i],&L[i],&D[i]); } scanf("%d",&Q); for(int i=0;i<Q;i++) { scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].I); node[i].index=i; } sort(node,node+Q,cmp); int t=1; for(int i=0;i<Q;i++) { while(t<=m&&node[i].I>=t) { int t1=find(F1[t]),t2=find(F2[t]); if(t1!=t2) { F[t2]=t1; if(D[t][0]=='N') { dy[t2]=dy[F1[t]]-dy[F2[t]]+L[t]; dx[t2]=dx[F1[t]]-dx[F2[t]]; } else if(D[t][0]=='S') { dy[t2]=dy[F1[t]]-dy[F2[t]]-L[t]; dx[t2]=dx[F1[t]]-dx[F2[t]]; } else if(D[t][0]=='E') { dx[t2]=dx[F1[t]]-dx[F2[t]]+L[t]; dy[t2]=dy[F1[t]]-dy[F2[t]]; } else if(D[t][0]=='W') { dx[t2]=dx[F1[t]]-dx[F2[t]]-L[t]; dy[t2]=dy[F1[t]]-dy[F2[t]]; } } t++; } if(find(node[i].u)!=find(node[i].v))ans[node[i].index]=-1; else { ans[node[i].index]=abs(dx[node[i].u]-dx[node[i].v])+abs(dy[node[i].u]-dy[node[i].v]); } } for(int i=0;i<Q;i++)printf("%d\n",ans[i]); } return 0; }