1 条题解

  • 0
    @ 2025-3-2 14:52:54

    Floyd 预处理

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 300;
    const int INF = 2147483647;
    int n, m, T;
    int e[MAXN + 5][MAXN + 5];
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m >> T;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                e[i][j] = INF;
        for (int i = 1; i <= m; i++)
        {
            int u, v, w;
            cin >> u >> v >> w;
            e[u][v] = w;
        }
        for (int k = 1; k <= n; k++)
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                    if (e[i][k] != INF && e[k][j] != INF)
                        e[i][j] = min(e[i][j],
                                      max(e[i][k], e[k][j]));
        while (T--)
        {
            int st, ed;
            cin >> st >> ed;
            if (e[st][ed] == INF)
                cout << -1 << "\n";
            else
                cout << e[st][ed] << "\n";
        }
        return 0;
    }
    

    Dijkstra 预处理

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 300;
    const int INF = 2147483647;
    int n, m, T;
    vector<pair<int, int>> e[MAXN + 5];
    int dis[MAXN + 5][MAXN + 5];
    bool vis[MAXN + 5][MAXN + 5];
    priority_queue<pair<int, int>> pq;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m >> T;
        for (int i = 1; i <= m; i++)
        {
            int u, v, w;
            cin >> u >> v >> w;
            e[u].push_back(make_pair(v, w));
        }
        for (int s = 1; s <= n; s++)
        {
            for (int i = 1; i <= n; i++)
                dis[s][i] = INF;
            dis[s][s] = 0;
            pq.push(make_pair(-dis[s][s], s));
            while (!pq.empty())
            {
                int u = pq.top().second;
                pq.pop();
                if (vis[s][u])
                    continue;
                for (int i = 0; i < e[u].size(); i++)
                {
                    int v = e[u][i].first;
                    int w = e[u][i].second;
                    if (max(dis[s][u], w) < dis[s][v])
                    {
                        dis[s][v] = max(dis[s][u], w);
                        pq.push(make_pair(-dis[s][v], v));
                    }
                }
            }
        }
        while (T--)
        {
            int st, ed;
            cin >> st >> ed;
            if (dis[st][ed] == INF)
                cout << -1 << "\n";
            else
                cout << dis[st][ed] << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1785
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    24
    已通过
    10
    上传者