poj 1984 并查集
题目意思是一个图中,只有上下左右四个方向的边。给出这样的一些边,
求任意指定的2个节点之间的距离。
就是看不懂,怎么破
1 /* 2 POJ 1984 3 并查集 4 */ 5 6 #include <stdio.h> 7 #include <string.h> 8 #include <iostream> 9 #include <algorithm> 10 #include <math.h> 11 using namespace std; 12 13 const int MAXN=40010; 14 int F[MAXN]; 15 int dx[MAXN],dy[MAXN]; 16 17 18 int F1[MAXN],F2[MAXN],L[MAXN]; 19 char D[MAXN][3]; 20 21 struct Node 22 { 23 int u,v; 24 int index; 25 int I; 26 }node[MAXN]; 27 int ans[MAXN]; 28 29 int find(int x) 30 { 31 if(F[x]==-1)return x; 32 int tmp=find(F[x]); 33 dx[x]+=dx[F[x]]; 34 dy[x]+=dy[F[x]]; 35 return F[x]=tmp; 36 } 37 bool cmp(Node a,Node b) 38 { 39 return a.I<b.I; 40 } 41 int main() 42 { 43 int n,m; 44 int Q; 45 #ifndef ONLINE_JUDGE 46 freopen("1.in","r",stdin); 47 #endif 48 while(scanf("%d%d",&n,&m)==2) 49 { 50 memset(F,-1,sizeof(F)); 51 memset(dx,0,sizeof(dx)); 52 memset(dy,0,sizeof(dy)); 53 for(int i=1;i<=m;i++) 54 { 55 scanf("%d%d%d%s",&F1[i],&F2[i],&L[i],&D[i]); 56 } 57 scanf("%d",&Q); 58 for(int i=0;i<Q;i++) 59 { 60 scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].I); 61 node[i].index=i; 62 } 63 sort(node,node+Q,cmp); 64 int t=1; 65 for(int i=0;i<Q;i++) 66 { 67 while(t<=m&&node[i].I>=t) 68 { 69 int t1=find(F1[t]),t2=find(F2[t]); 70 if(t1!=t2) 71 { 72 F[t2]=t1; 73 if(D[t][0]=='N') 74 { 75 dy[t2]=dy[F1[t]]-dy[F2[t]]+L[t]; 76 dx[t2]=dx[F1[t]]-dx[F2[t]]; 77 } 78 else if(D[t][0]=='S') 79 { 80 dy[t2]=dy[F1[t]]-dy[F2[t]]-L[t]; 81 dx[t2]=dx[F1[t]]-dx[F2[t]]; 82 } 83 else if(D[t][0]=='E') 84 { 85 dx[t2]=dx[F1[t]]-dx[F2[t]]+L[t]; 86 dy[t2]=dy[F1[t]]-dy[F2[t]]; 87 } 88 else if(D[t][0]=='W') 89 { 90 dx[t2]=dx[F1[t]]-dx[F2[t]]-L[t]; 91 dy[t2]=dy[F1[t]]-dy[F2[t]]; 92 } 93 } 94 t++; 95 } 96 if(find(node[i].u)!=find(node[i].v))ans[node[i].index]=-1; 97 else 98 { 99 ans[node[i].index]=abs(dx[node[i].u]-dx[node[i].v])+abs(dy[node[i].u]-dy[node[i].v]); 100 } 101 } 102 for(int i=0;i<Q;i++)printf("%d\n",ans[i]); 103 } 104 return 0; 105 }