• 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
    ",ans[i]);
    103     }
    104     return 0;
    105 }
  • 相关阅读:
    MySQL监控脚本
    django学习笔记【004】创建带有model的app
    MySQL-group-replication 配置
    MySQL配置文件模板
    Python 正则表达式
    MYSQL的安全模式:sql_safe_updates介绍
    Git branch && Git checkout常见用法
    git rebase和git merge的用法
    Git最牛最全详解
    理解npm run
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4480938.html
Copyright © 2020-2023  润新知