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 }

 

posted @ 2015-05-06 09:23  miao_a_miao  阅读(172)  评论(0编辑  收藏  举报