1 条题解

  • 0
    @ 2026-9-23 0:54:09

    按照题目给定方式建边之后跑 Dijkstra 后,你会发现有一些点 MLE 了,因为会出现一种环,使越跑越小,然后就一直往下跑。

    对于这种情况我有一种比较直接的方法,因为在没有这种环的情况下,队列中最多有 MM 个,然而如果有这种环,队列中就不止 MM 个了,所以在 Dijkstra 里面判断就行。

    给出代码。

    #include <bits/stdc++.h>
    using namespace std;
    struct node{
        int v;
        long double w;
    };
    vector <node> a[2004];
    priority_queue<pair<long double,int>,vector<pair<long double,int>>,greater<pair<long double,int>>> pq;
    long double dis[2004];
    int vis[2005];
    int main(){
        int n,m;
        int s,t;
        long double v;
        cin >> n >> m;
        cin >> v>>s >> t;
    
        for (int i = 1; i <= m; i++){
            int u,v;
            long double w;
            cin >>u >> v >> w;
            a[u].push_back({v,w});
        }
        for (int i = 1; i <= n; i++) dis[i] = DBL_MAX;
        pq.push({v,s});
        dis[s] = v;
        int flag =0;
        while (!pq.empty()){
            int x = pq.top().second;
            pq.pop();
            if (pq.size()>25000) {flag = 1;break;}
            //cout << x << " " << dis[x] << "\n";
            vis[x] = 1;
            for (int i = 0; i < a[x].size(); i++){
                int y = a[x][i].v;
                long double z =a[x][i].w;
                if (dis[y] > dis[x]*z){
                    //cout << x << " " << y  << " " << z << "\n";
                    dis[y] = dis[x]*z;
                    pq.push({dis[y],y});
                }
            }
        }
        if (flag) {cout << 0;return 0;}
        cout << fixed << setprecision(8) << dis[t];
        return 0;
    }
    • 1

    [USACO10DEC] Big Macs Around the World G

    信息

    ID
    1575
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者