• Navigation Nightmare POJ


    Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series of M (1 <= M < 40,000) vertical and horizontal roads each of varying lengths (1 <= length <= 1000) connect the farms. A map of these farms might look something like the illustration below in which farms are labeled F1..F7 for clarity and lengths between connected farms are shown as (n): 

               F1 --- (13) ---- F6 --- (9) ----- F3
    
                |                                 |
    
               (3)                                |
    
                |                                (7)
    
               F4 --- (20) -------- F2            |
    
                |                                 |
    
               (2)                               F5
    
                | 
    
               F7 


    Being an ASCII diagram, it is not precisely to scale, of course. 

    Each farm can connect directly to at most four other farms via roads that lead exactly north, south, east, and/or west. Moreover, farms are only located at the endpoints of roads, and some farm can be found at every endpoint of every road. No two roads cross, and precisely one path 
    (sequence of roads) links every pair of farms. 

    FJ lost his paper copy of the farm map and he wants to reconstruct it from backup information on his computer. This data contains lines like the following, one for every road: 

    There is a road of length 10 running north from Farm #23 to Farm #17 
    There is a road of length 7 running east from Farm #1 to Farm #17 
    ... 

    As FJ is retrieving this data, he is occasionally interrupted by questions such as the following that he receives from his navigationally-challenged neighbor, farmer Bob: 

    What is the Manhattan distance between farms #1 and #23? 

    FJ answers Bob, when he can (sometimes he doesn't yet have enough data yet). In the example above, the answer would be 17, since Bob wants to know the "Manhattan" distance between the pair of farms. 
    The Manhattan distance between two points (x1,y1) and (x2,y2) is just |x1-x2| + |y1-y2| (which is the distance a taxicab in a large city must travel over city streets in a perfect grid to connect two x,y points). 

    When Bob asks about a particular pair of farms, FJ might not yet have enough information to deduce the distance between them; in this case, FJ apologizes profusely and replies with "-1". 

    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

    At time 1, FJ knows the distance between 1 and 6 is 13. 
    At time 3, the distance between 1 and 4 is still unknown. 
    At the end, location 6 is 3 units west and 7 north of 2, so the distance is 10. 

    今天又做了两道带权并查集题目

    对带权并查集又有了新的理解

    大概说一下

    并查集的实质是一个集合 对于每一个点的父节点只能有一个

    因此插入时并不能随意更改子节点的father数组 而因该去找到他的祖宗节点进行进行更更新

    而权值也是一样 我们不该更新 该节点的权值

    而是更新祖宗节点的权值

    其实带权并查集所解决的都是一类各个点之间的相互的关系的问题

    我们更改祖宗节点之后 原组祖宗节点们的子节点们也会被更新

    而带权并查集最重要的就是将fa1和fa2的转移公式推出

    以上是我个人到目前为止对带权并查集的理解

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    int father[40005];
    int disx[40005];
    int disy[40005];
    struct edge
    {
        //x 东西方向--东正
        //y 南北方向--北正
        int x,y;
        int dis;
        char op[10];
    }a[40005];//输入的边点信息顺序储存
    struct qurey
    {
        int x,y;
        int id;
        int ti;
        int ans;
    }b[40005];//输入的查询顺序 需要两次排序
    int cmp1(qurey p,qurey q)
    {
        return p.id<q.id;
    }
    int cmp2(qurey p,qurey q)
    {
        return p.ti<q.ti;
    }
    int fin(int z)
    {
        if(z==father[z]) return z;
        else
        {
            int tmp=father[z];
            father[z]=fin(father[z]);
            disx[z]=disx[z]+disx[tmp];
            disy[z]=disy[z]+disy[tmp];
        }
        return father[z];
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            father[i]=i;
        char op[10];
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d%s",&a[i].x,&a[i].y,&a[i].dis,a[i].op);
        }
        int k;
        scanf("%d",&k);
        for(int i=1;i<=k;i++)
        {
            scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].ti);
            b[i].id=i;
        }
        sort(b+1,b+1+k,cmp2);
        int pos=1;
        for(int i=1;i<=m+1;i++)
        {
            while((b[pos].ti<i||i==m+1)&&pos<=k)
            {
                int tmp1=fin(b[pos].x);
                int tmp2=fin(b[pos].y);
                if(tmp1==tmp2)
                {
                    int tmpans;
                    tmpans=abs(disx[b[pos].x]-disx[b[pos].y])+abs(disy[b[pos].x]-disy[b[pos].y]);
                    b[pos].ans=tmpans;
                }
                else
                {
                    b[pos].ans=-1;
                }
                pos++;
            }
            if(i>m) continue;
            int tempx;
            int tempy;
            int fa1=fin(a[i].x);
            int fa2=fin(a[i].y);
            if(fa1==fa2) continue;
            if(a[i].op[0]=='E')
            {
                tempx=a[i].dis;
                tempy=0;
            }
            if(a[i].op[0]=='S')
            {
                tempx=0;
                tempy=-a[i].dis;
            }
            if(a[i].op[0]=='N')
            {
                tempx=0;
                tempy=a[i].dis;
            }
            if(a[i].op[0]=='W')
            {
                tempx=-a[i].dis;
                tempy=0;
            }
            disx[fa1]=disx[a[i].y]-tempx-disx[a[i].x];
            disy[fa1]=disy[a[i].y]-tempy-disy[a[i].x];
            father[fa1]=fa2;
        }
        sort(b+1,b+1+k,cmp1);
        for(int i=1;i<=k;i++)
        {
            //cout<<k<<endl;
            printf("%d
    ",b[i].ans);
        }
    }
  • 相关阅读:
    ZZ 一些有意思的算法代码
    ff 怎样让新打开的标签就放在当前页面的右边
    111
    Windows平台下GO语言编译器(GOwindows)
    My Bookmarks
    使用googleperftools的tcmalloc
    memcached安装及测试
    erlang 入门(1)
    MS UI Automation
    twisted: echo server
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852298.html
Copyright © 2020-2023  润新知