zoukankan      html  css  js  c++  java
  • 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始---

    P1522 牛的旅行 Cow Tours
    189
    通过
    502
    提交
    题目提供者该用户不存在
    标签 图论 USACO
    难度 提高+/省选-
    提交该题 讨论 题解 记录

    最新讨论

    输出格式
    题目描述

    农民 John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通。这样,Farmer John就有多个牧场了。

    John想在牧场里添加一条路径(注意,恰好一条)。对这条路径有以下限制:

    一个牧场的直径就是牧场中最远的两个牧区的距离(本题中所提到的所有距离指的都是最短的距离)。考虑如下的有5个牧区的牧场,牧区用“*”表示,路径用直线表示。每一个牧区都有自己的坐标:

    (15,15) (20,15)
    D E
    *-------*
    | _/|
    | _/ |
    | _/ |
    |/ |
    *--------*-------*
    A B C
    (10,10) (15,10) (20,10)
    【请将以上图符复制到记事本中以求更好的观看效果,下同】

    这个牧场的直径大约是12.07106, 最远的两个牧区是A和E,它们之间的最短路径是A-B-E。

    这里是另一个牧场:

    *F(30,15)
    /
    _/
    _/
    /
    *------*
    G H
    (25,10) (30,10)
    在目前的情景中,他刚好有两个牧场。John将会在两个牧场中各选一个牧区,然后用一条路径连起来,使得连通后这个新的更大的牧场有最小的直径。

    注意,如果两条路径中途相交,我们不认为它们是连通的。只有两条路径在同一个牧区相交,我们才认为它们是连通的。

    输入文件包括牧区、它们各自的坐标,还有一个如下的对称邻接矩阵


      A B C D E F G H
    A 0 1 0 0 0 0 0 0
    B 1 0 1 1 1 0 0 0
    C 0 1 0 0 1 0 0 0
    D 0 1 0 0 1 0 0 0
    E 0 1 1 1 0 0 0 0
    F 0 0 0 0 0 0 1 0
    G 0 0 0 0 0 1 0 1
    H 0 0 0 0 0 0 1 0
    其他邻接表中可能直接使用行列而不使用字母来表示每一个牧区。输入数据中不包括牧区的名字。

    输入文件至少包括两个不连通的牧区。

    请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径。输出在所有牧场中最小的可能的直径。

    输入输出格式

    输入格式:
    第1行: 一个整数N (1 <= N <= 150), 表示牧区数

    第2到N+1行: 每行两个整数X,Y (0 <= X ,Y<= 100000), 表示N个牧区的坐标。注意每个 牧区的坐标都是不一样的。

    第N+2行到第2*N+1行: 每行包括N个数字(0或1) 表示如上文描述的对称邻接矩阵。

    输出格式:
    只有一行,包括一个实数,表示所求直径。数字保留六位小数。

    只需要打到小数点后六位即可,不要做任何特别的四舍五入处理。

    输入输出样例

    输入样例#1:
    8
    10 10
    15 10
    20 10
    15 15
    20 15
    30 15
    25 10
    30 10
    01000000
    10111000
    01001000
    01001000
    01110000
    00000010
    00000101
    00000010
    输出样例#1:
    22.071068
    说明

    翻译来自NOCOW

    USACO 2.4

    ---恢复内容结束---

    P1522 牛的旅行 Cow Tours
    189
    通过
    502
    提交
    题目提供者该用户不存在
    标签 图论 USACO
    难度 提高+/省选-
    提交该题 讨论 题解 记录

    最新讨论

    输出格式
    题目描述

    农民 John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通。这样,Farmer John就有多个牧场了。

    John想在牧场里添加一条路径(注意,恰好一条)。对这条路径有以下限制:

    一个牧场的直径就是牧场中最远的两个牧区的距离(本题中所提到的所有距离指的都是最短的距离)。考虑如下的有5个牧区的牧场,牧区用“*”表示,路径用直线表示。每一个牧区都有自己的坐标:

    (15,15) (20,15)
    D E
    *-------*
    | _/|
    | _/ |
    | _/ |
    |/ |
    *--------*-------*
    A B C
    (10,10) (15,10) (20,10)
    【请将以上图符复制到记事本中以求更好的观看效果,下同】

    这个牧场的直径大约是12.07106, 最远的两个牧区是A和E,它们之间的最短路径是A-B-E。

    这里是另一个牧场:

    *F(30,15)
    /
    _/
    _/
    /
    *------*
    G H
    (25,10) (30,10)
    在目前的情景中,他刚好有两个牧场。John将会在两个牧场中各选一个牧区,然后用一条路径连起来,使得连通后这个新的更大的牧场有最小的直径。

    注意,如果两条路径中途相交,我们不认为它们是连通的。只有两条路径在同一个牧区相交,我们才认为它们是连通的。

    输入文件包括牧区、它们各自的坐标,还有一个如下的对称邻接矩阵


      A B C D E F G H
    A 0 1 0 0 0 0 0 0
    B 1 0 1 1 1 0 0 0
    C 0 1 0 0 1 0 0 0
    D 0 1 0 0 1 0 0 0
    E 0 1 1 1 0 0 0 0
    F 0 0 0 0 0 0 1 0
    G 0 0 0 0 0 1 0 1
    H 0 0 0 0 0 0 1 0
    其他邻接表中可能直接使用行列而不使用字母来表示每一个牧区。输入数据中不包括牧区的名字。

    输入文件至少包括两个不连通的牧区。

    请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径。输出在所有牧场中最小的可能的直径。

    输入输出格式

    输入格式:
    第1行: 一个整数N (1 <= N <= 150), 表示牧区数

    第2到N+1行: 每行两个整数X,Y (0 <= X ,Y<= 100000), 表示N个牧区的坐标。注意每个 牧区的坐标都是不一样的。

    第N+2行到第2*N+1行: 每行包括N个数字(0或1) 表示如上文描述的对称邻接矩阵。

    输出格式:
    只有一行,包括一个实数,表示所求直径。数字保留六位小数。

    只需要打到小数点后六位即可,不要做任何特别的四舍五入处理。

    输入输出样例

    输入样例#1:
    8
    10 10
    15 10
    20 10
    15 15
    20 15
    30 15
    25 10
    30 10
    01000000
    10111000
    01001000
    01001000
    01110000
    00000010
    00000101
    00000010
    输出样例#1:
    22.071068
    说明

    翻译来自NOCOW

    USACO 2.4

    分析:读这道题感觉很考验我的语文能力一会最大一会最小,而且题目好像写错了?首先要把每两个点之间的最短路求出来,本题的规模很小,就用floyd算法,然后计算离每个点最远的那个点的距离,记作zuiyuan[i],那么我们要求一条路径,这条路径通过枚举就可以得到,如果两个点之间的路程为inf,并且是两个不同的点i,j,那么则连起来那么合起来的牧场的直径就是dist(i,j)+zuiyuan[i] + zuiyuan[j]为什么呢......很简单,第一个牧场的是离i最远距离,第二个牧场类同,中间只有一条路径相连,当然就是直径了,那么因为要求最小的直径,所以不断取最小值.注意题目让我们求3个牧场(合起来有一个)中的最“小”值,我感觉并不是求最小值,应该是求最大值,那么在计算zuiyuan[i]的时候记录一下就可以了.

    #include <cstdio>
    #include <cmath>
    #include <queue>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int maxn = 160,inf = 1e18;
    
    int n;
    double x[maxn], y[maxn],d[maxn][maxn],zuiyuan[maxn],ans1,ans2;
    char s[maxn];
    
    double jisuan(double x, double y, double x1, double y1)
    {
        return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
    }
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%lf%lf", &x[i], &y[i]);
        for (int i = 1; i <= n; i++)
        {
            scanf("%s", s + 1);
            for (int j = 1; j <= n; j++)
            {
                if (s[j] == '1')
                    d[i][j] = jisuan(x[i], y[i], x[j], y[j]);
                else
                    d[i][j] = inf;
            }
        }
        for (int k = 1; k <= n; k++)
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                    if (i != j && j != k && i != k) //不要写成i != j != k
                        if (d[i][k] != inf && d[k][j] != inf)
                            d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
        for (int i = 1; i <= n; i++)
        {
            zuiyuan[i] = 0;
            for (int j = 1; j <= n; j++)
                if (d[i][j] != inf)
                    zuiyuan[i] = max(zuiyuan[i], d[i][j]);
            ans2 = max(ans2, zuiyuan[i]);
        }
        ans1 = inf;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (i != j && d[i][j] == inf)
                    ans1 = min(ans1, zuiyuan[i] + zuiyuan[j] + jisuan(x[i],y[i],x[j],y[j]));
        printf("%.6lf
    ", max(ans1, ans2));
    
        return 0;
    }
  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5797086.html
Copyright © 2011-2022 走看看