朴素 prim MLE 求调
查看原帖
朴素 prim MLE 求调
693428
unDefined_Future楼主2023/8/19 19:04

rt,邻接矩阵和链式前向星都 MLE。

//链式前向星
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

int n;
const int N = 5010;
double x[N], y[N];
double g[N][N];
int e[N * (N - 1) / 2], ne[N * (N - 1) / 2], h[N], idx = 1;
double w[N * (N - 1) / 2];

void add(int u, int v, double p) {
    e[idx] = v, ne[idx] = h[u], w[idx] = p, h[u] = idx++;
}

double dis[N]; int vis[N];
double prim() {
    for (int i = 1; i <= n; i++) dis[i] = 1e9;
    double res = 0;
    for (int i = 1; i <= n; i++) {
        double mint = 1e9; int minid = -1;
        for (int j = 1; j <= n; j++) {
            if((minid == -1 || mint > dis[j]) && vis[j] == 0) {
                mint = dis[j];
                minid = j;
            }
        }
        if(i != 1 && dis[minid] == 1e9) return -1;
        if(i != 1) res += mint;
        vis[minid] = 1;
        for(int j = h[minid]; j; j = ne[j]) {
            int to = e[j];
            if(dis[to] > w[j]) dis[to] = w[j];
        }
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if(i != j) {
                add(i, j, sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])));
            }
        }
    }
    
    printf("%.2lf", prim());
    return 0;
}

链式前向星记录

//邻接矩阵
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

int n;
const int N = 5010;
double x[N], y[N];
double g[N][N];


double dis[N]; int vis[N];
double prim() {
    for (int i = 1; i <= n; i++) dis[i] = 1e9;
    double res = 0;
    for (int i = 1; i <= n; i++) {
        double mint = 1e9; int minid = -1;
        for (int j = 1; j <= n; j++) {
            if((minid == -1 || mint > dis[j]) && vis[j] == 0) {
                mint = dis[j];
                minid = j;
            }
        }
        if(i != 1 && dis[minid] == 1e9) return -1;
        if(i != 1) res += mint;
        vis[minid] = 1;
        for (int j = 1; j <= n; j++) {
            dis[j] = min(dis[j], g[minid][j]);
        }
        
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if(i != j) {
                g[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
            }
        }
    }
    
    printf("%.2lf", prim());
    return 0;
}

邻接矩阵记录

2023/8/19 19:04
加载中...