蓝桥公园——JAVA

简介: 蓝桥公园——JAVA

 题目链接:

题目描述

小明喜欢观景,于是今天他来到了蓝桥公园。

已知公园有 N 个景点,景点和景点之间一共有 M条道路。小明有 Q个观景计划,每个计划包含一个起点 st和一个终点 ed,表示他想从 stst 去到 ed。但是小明的体力有限,对于每个计划他想走最少的路完成,你可以帮帮他吗?

输入描述

输入第一行包含三个正整数 N,M,Q

第 2 到 M + 1 行每行包含三个正整数 u,v,w表示 vu↔v 之间存在一条距离为 w 的路。

第 M+2 到 M + Q-1 行每行包含两个正整数 st,ed,其含义如题所述。

输出描述

输出共 Q 行,对应输入数据中的查询。

若无法从 st 到达 eded 则输出 −1。

输入输出样例

示例 1

输入

3 3 3
1 2 1
1 3 5
2 3 2
1 2
1 3
2 3

image.gif

输出

1
3
2

image.gif

运行限制

语言 最大运行时间 最大运行内存
C++ 1s 256M
C 1s 256M
Java 3s 256M
Python3 50s 256M

JAVA:

import java.util.Arrays;
import java.util.Scanner;
public class 蓝桥公园 {
    private static final long INF = 0x3f3f3f3f3f3f3f3fL;
    private static final int N = 405;
    private static long[][] dp = new long[N][N];
    private static int n, m, q;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        q = scanner.nextInt();
        for (long[] row : dp) {
            Arrays.fill(row, INF);
        }
        for (int i = 0; i < m; i++) {
            int u = scanner.nextInt();
            int v = scanner.nextInt();
            long w = scanner.nextLong();
            dp[u][v] = dp[v][u] = Math.min(dp[u][v], w);
        }
        floyd();
        while (q-- > 0) {
            int s = scanner.nextInt();
            int t = scanner.nextInt();
            if (dp[s][t] == INF) {
                System.out.println(-1);
            } else if (s == t) {
                System.out.println(0);
            } else {
                System.out.println(dp[s][t]);
            }
        }
    }
    private static void floyd() {
        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k][j]);
                }
            }
        }
    }
}

image.gif

C/C++:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 405;
const ll INF = 0x3f3f3f3f3f3f3f3fLL;
ll dis[N][N];
int n, m, q;
int main()
{
    cin >> n >> m >> q;
    memset(dis, 0x3f, sizeof dis);
    for (int i = 1; i <= n; i++) dis[i][i] = 0;
    for (int i = 1; i <= m; i++) {
        ll u, v, w; cin >> u >> v >> w;
        dis[u][v] = dis[v][u] = min(dis[u][v], w); // 防止出现重边
    }
    // floyd
    for (int k = 1; k <= n; k++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
    // 输出
    int s, t;
    for (int i = 0; i < q; i++) {
        cin >> s >> t;
        ll ans = dis[s][t] == INF ? -1 : dis[s][t];
        cout << ans << endl;
    }
    return 0;
}

image.gif


相关文章
|
6月前
|
安全 Java 数据库连接
【Java每日一题】——第四十六题:Java每日一题最最后一期
【Java每日一题】——第四十六题:Java每日一题最最后一期
|
5月前
|
Java
中秋节怎么能少了月饼(java)
中秋节怎么能少了月饼(java)
Java完成迪迦奥特曼打小怪兽
Java完成迪迦奥特曼打小怪兽
208 0
|
Java
【Java】 三国大乱斗部分代码
【Java】 三国大乱斗部分代码
120 0
|
算法
java202303java学习笔记第三十天五道经典算法题3
java202303java学习笔记第三十天五道经典算法题3
40 0
|
算法
java202303java学习笔记第三十天五道经典算法题1
java202303java学习笔记第三十天五道经典算法题1
43 0
|
算法
java202303java学习笔记第三十天五道经典算法题4
java202303java学习笔记第三十天五道经典算法题4
57 0
|
算法
java202303java学习笔记第三十天五道经典算法题2
java202303java学习笔记第三十天五道经典算法题2
39 0
1092 最好吃的月饼(JAVA)
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种。
1092 最好吃的月饼(JAVA)
下一篇
无影云桌面