• P1529 [USACO2.4] 回家 Bessie Come Home 题解


    题目描述

    现在是晚餐时间,而母牛们在外面分散的牧场中。

    Farmer John 按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。

    每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。至少有一个牧场和谷仓之间有道路连接。因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。牧场被标记为 a … z \texttt{a} \ldots \texttt{z} az A … Y \texttt{A} \ldots \texttt{Y} AY,在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是 Z \texttt{Z} Z,注意没有母牛在谷仓中。

    注意 m \texttt{m} m M \texttt{M} M 不是同一个牧场

    输入格式

    第一行一个整数 P P P 1 ≤ P ≤ 1 0 4 1\leq P \leq 10^4 1P104),表示连接牧场(谷仓)的道路的数目。

    接下来 P P P 行,每行用空格分开的两个字母和一个正整数:被道路连接牧场的标号和道路的长度(道路长度均不超过 1 0 3 10^3 103)。

    输出格式

    单独的一行包含二个项目:最先到达谷仓的母牛所在的牧场的标号,和这只母牛走过的路径的长度。

    样例

    样例输入

    5
    A d 6
    B d 3
    C e 9
    d Z 8
    e Z 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    样例输出

    B 11
    
    • 1

    提示

    翻译来自 NOCOW

    USACO 2.4

    完整代码

    #include 
    using namespace std;
    int m, cnt = 0, o = 0, dist[10002], h[152];
    bool vis[10002];
    struct node {
        int to, nxt, w;
    } e[20005];
    void add(int u, int v, int w) { cnt++, e[cnt].w = w, e[cnt].to = v, e[cnt].nxt = h[u], h[u] = cnt; }
    struct cmp {
        bool operator()(int a, int b) { return dist[a] > dist[b]; }
    };
    priority_queue<int, vector<int>, cmp> q;
    void d(int x) {
        memset(dist, 0x3f, sizeof(dist));
        memset(vis, 0, sizeof(vis));
        dist[x] = 0, q.push(x);
        while (!q.empty()) {
            int u = q.top();
            q.pop();
            if (vis[u])
                continue;
            vis[u] = true;
            for (int i = h[u]; i; i = e[i].nxt) {
                int v = e[i].to;
                if (!vis[v] && dist[u] + e[i].w < dist[v])
                    dist[v] = dist[u] + e[i].w, q.push(v);
            }
        }
    }
    int main() {
        scanf("%d", &m);
        for (int i = 1, c; i <= m; i++) {
            char cha, chb;
            scanf(" %c %c %d", &cha, &chb, &c);
            add(int(cha), int(chb), c), add(int(chb), int(cha), c);
        }
        int minn = 0x3f3f3f3f, k;
        for (int i = 65; i <= 89; i++)
            if (h[i]) {
                d(i);
                if (dist[90] != 0x3f3f3f3f && minn > dist[90])
                    minn = dist[90], k = i;
            }
        printf("%c %d", char(k), minn);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46




  • 相关阅读:
    阿里面试官问我Redis该如何内存优化,这不有手就行?
    onnx如何在中间删除了一个节点,怎么样把剩下的节点连接一起呢
    大一学生《Web编程基础》HTML实例网页代码 HTML+CSS+JS 黑色横排的个人主页作品
    gRPC 健康检查
    CTF取证技术实战,图片、文件、流等相关内容的取证技术
    INI文件读写
    机器学习-计算数据之间的距离
    bootloader介绍
    C++switch语句
    Linux内核开发基础 --- 使用链表管理多设备
  • 原文地址:https://blog.csdn.net/LOSER_World/article/details/134341895