请问MLE该如何优化
查看原帖
请问MLE该如何优化
206423
焚魂楼主2024/9/17 14:12

我用的dijstra,但是怎么改都60ptsmle,该如何优化呢,还是说应该换一种方法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

long long n,m,head[200010],tot,dis[15010][15010],q,s,t;
bool vis[20010];
struct node{
    long long next,v,w;
}cnt[200010];
priority_queue<pair<long long,long long> > qq;

void insert(long long u,long long v,long long w) {
    cnt[++tot].next = head[u];
    cnt[tot].v = v;
    cnt[tot].w = w;
    head[u] = tot;
}

int main() {
    cin >> n >> m;
    for(long long i = 1;i <= m;i++) {
        long long x,y,z;
        cin >> x >> y >> z;
        dis[x][y] = max(dis[x][y],z);
        dis[y][x] = max(dis[y][x],z);
    }

    for(long long i = 1;i <= n;i++)
        for(long long j = 1;j <= n;j++) {
            if(i != j && dis[i][j] != 0)
                insert(i,j,dis[i][j]);
        }
    
    for(long long i = 1;i <= n;i++)
        for(long long j = 1;j <= n;j++) {
            if(dis[i][j] == 0)
                dis[i][j] = 1e18;
        }

    cin >> q;
    for(long long i = 1;i <= q;i++) {
        cin >> s >> t;
        for(int j = 1;j <= n;j++) vis[j] = false;
        qq.push(make_pair(0,s));
        while(!qq.empty()) {
            long long k = qq.top().second;
            qq.pop();
            if(vis[k] == true) continue;
            vis[k] = true;
            for(long long j = head[k];j;j = cnt[j].next) {
                if(dis[s][cnt[j].v] <= min(dis[s][k],cnt[j].w) || dis[s][cnt[j].v] == 1e18) {
                    dis[s][cnt[j].v] = min(dis[s][k],cnt[j].w);
                    qq.push(make_pair(dis[s][cnt[j].v],cnt[j].v));
                }
            }
        }
        if(dis[s][t] == 1e18) cout << -1 << endl;
        else cout << dis[s][t] << endl;
    }


    return 0;
}
2024/9/17 14:12
加载中...