1 条题解

  • 0
    @ 2025-4-4 14:07:33
    #include <bits/stdc++.h>
    using namespace std;
    int n, m;
    struct Edge
    {
        int v, w, f;
    };
    vector<Edge> e[1010];
    struct Point
    {
        int id, dis;
    };
    bool operator<(Point a, Point b)
    {
        return a.dis > b.dis;
    }
    int dis[1010];
    bool vis[1010];
    
    priority_queue<Point> q;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cin >> n >> m;
        int maxf = 0, minf = 0x3f3f3f3f;
        for (int i = 1; i <= m; i++)
        {
            int u, v, w, f;
            cin >> u >> v >> w >> f;
            e[u].push_back((Edge){v, w, f});
            e[v].push_back((Edge){u, w, f});
            minf = min(minf, f);
            maxf = max(maxf, f);
        }
        int ans = 0;
        for (int i = minf; i <= maxf; i++)
        {
            // 最短路
    
            // 初始化
            while (!q.empty())
            {
                q.pop();
                // 
                //cout << " ";
            }
            memset(dis, 0x3f, sizeof(dis));
            memset(vis, false, sizeof(vis));
            dis[1] = 0;
            q.push((Point){1, 0});
            // dijkstra
            for (int t = 1; t < n; t++)
            {
                while (!q.empty() && vis[q.top().id])
                {
                    q.pop();
                }
                if (q.empty())
                    break;
                int u = q.top().id;
                vis[u] = true;
                for (int j = 0; j < e[u].size(); j++)
                {
                    int f = e[u][j].f;
                    if (f < i)
                        continue;
                    int v = e[u][j].v;
                    if (vis[v])
                        continue;
                    int w = e[u][j].w;
                    if (dis[v] > dis[u] + w)
                    {
                        dis[v] = dis[u] + w;
                        q.push((Point){v, dis[v]});
                    }
                }
            }
            if (dis[n] == 0x3f3f3f3f)
            {
                continue;
            }
            double res = 1e6*i / dis[n];
            ans = max(ans, (int)res);
        }
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    1786
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    18
    已通过
    9
    上传者