• 洛谷P2738 [USACO4.1]篱笆回路Fence Loops


    P2738 [USACO4.1]篱笆回路Fence Loops

    •  
    • 11通过
    • 21提交
    • 题目提供者该用户不存在
    • 标签USACO
    • 难度提高+/省选-

     提交  讨论  题解  

    最新讨论

    • 暂时没有讨论

    题目描述

    农夫布朗的牧场上的篱笆已经失去控制了。它们分成了1~200英尺长的线段。只有在线段的端点处才能连接两个线段,有时给定的一个端点上会有两个以上的篱笆。结果篱笆形成了一张网分割了布朗的牧场。布朗想将牧场恢复原样,出于这个考虑,他首先得知道牧场上哪一块区域的周长最小。 布朗将他的每段篱笆从1到N进行了标号(N=线段的总数)。他知道每段篱笆有如下属性:

    该段篱笆的长度

    该段篱笆的一端所连接的另一段篱笆的标号

    该段篱笆的另一端所连接的另一段篱笆的标号

    幸运的是,没有篱笆连接它自身。对于一组有关篱笆如何分割牧场的数据,写一个程序来计算出所有分割出的区域中最小的周长。

    例如,标号1~10的篱笆由下图的形式组成(下面的数字是篱笆的标号):

               1

       +---------------+

       |             /|

      2| 7          / |

       |           /  |

       +---+       /   |6

       | 8       /10  |

      3|     9  /     |

       |      /      |

       +-------+-------+

           4       5

    上图中周长最小的区域是由2,7,8号篱笆形成的。

    输入输出格式

    输入格式:

    第1行: N (1 <= N <= 100)

    第2行到第3*N+1行: 每三行为一组,共N组信息:

    每组信息的第1行有4个整数: s, 这段篱笆的标号(1 <= s <= N); Ls, 这段篱笆的长度 (1 <= Ls <= 255); N1s (1 <= N1s <= 8) 与本段篱笆的一端 所相邻的篱笆的数量; N2s与本段篱笆的另一端所相邻的篱笆的数量。 (1 <= N2s <= 8).

    每组信息的的第2行有 N1s个整数, 分别描述与本段篱笆的一端所相邻的篱笆的标号。

    每组信息的的第3行有N2s个整数, 分别描述与本段篱笆的另一端所相邻的篱笆的标号。

    输出格式:

    输出的内容为单独的一行,用一个整数来表示最小的周长。

    输入输出样例

    输入样例#1

    10

    1 16 2 2

    2 7

    10 6

    2 3 2 2

    1 7

    8 3

    3 3 2 1

    8 2

    4

    4 8 1 3

    3

    9 10 5

    5 8 3 1

    9 10 4

    6

    6 6 1 2

    5

    1 10

    7 5 2 2

    1 2

    8 9

    8 4 2 2

    2 3

    7 9

    9 5 2 3

    7 8

    4 5 10

    10 10 2 3

    1 6

    4 9 5

    输出样例#1

    12

    说明

    题目翻译来自NOCOW。

    USACO Training Section 4.1

    分析:求的图形是闭合图形,然后求周长最小的,很明显就是最小环,具体该怎么求呢?显然是用dfs,每次枚举一个点,从这个点开始dfs,到另一个点就打标记,继续搜,如果搜到了自己,则记录长度.只是在递归完后要消除标机,因为这个点可能不只属于一个环中,建图有点麻烦,找边也有点麻烦,细心点就好了。

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    int n,a[110][2][10],num[110][2],w[110],vis[110],ans = 100000000,bg;
    
    int check(int a1, int b)
    {
        for (int i = 1; i <= num[b][0]; i++)
            if (a[b][0][i] == a1)
                return 0;
        return 1;
    }
    
    void dfs(int u, int direction, int dist)
    {
        if (dist > ans)
            return;
        if (u == bg && dist)
        {
            ans = dist;
            return;
        }
        vis[u] = 1;
        for (int i = 1; i <= num[u][direction]; i++)
        {
            int v = a[u][direction][i];
            if (!vis[v] || v == bg)
                dfs(v, 1 - check(u, v), dist + w[u]);
        }
        vis[u] = 0;
    }
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            int x;
            scanf("%d", &x);
            scanf("%d%d%d", &w[x], &num[x][0], &num[x][1]);
            for (int j = 1; j <= num[x][0]; j++)
                scanf("%d", &a[x][0][j]);
            for (int j = 1; j <= num[x][1]; j++)
                scanf("%d", &a[x][1][j]);
        }
        for (bg = 1; bg <= n; bg++)
        {
            memset(vis, 0, sizeof(vis));
            dfs(bg, 0, 0);
        }
        printf("%d
    ", ans);
    
        return 0;
    }

     

     

  • 相关阅读:
    类实现接口(Example5_11)
    PyTorch之Checkpoint机制解析
    PyTorch之BN核心参数详解
    PyTorch之分布式操作Barrier
    PyTorch之对类别张量进行onehot编码
    PyTorch之具体显存占用分析
    Pytorch之SpatialShiftOperation的5种实现策略
    无密码远程桌面设置
    人生三个境界
    研华工控机设置上电自启动
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5971471.html
Copyright © 2020-2023  润新知