新人求助,初学prim,样例过不去
查看原帖
新人求助,初学prim,样例过不去
105230
Doubeecat楼主2020/8/6 11:58

RT……自闭

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
#define ll long long
#define ri register int

template <typename T> inline T min(T x,T y) {return x<y?x:y;}
template <typename T> inline T max(T x,T y) {return x>y?x:y;}
const int INF = 0x3f3f3f3f;
const ll inf = 0x3f3f3f3f3f3f3f3fLL;
const int N = 5010;

int n;
double dis[N],x[N],y[N];
bool vis[N];

double calc(double x1,double y1,double x2,double y2) {
    return (double)sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}

double Prim() {
    memset(dis,0x7f,sizeof dis);
    dis[1] = 0;
    for (int i = 2;i <= n;++i) {
        dis[i] = calc(x[1],y[1],x[i],y[i]);
    }
    double ans = 0;
    int now = 1;
    for (int tot = 1;tot < n;++tot) {
        double minn = INF*1.0;
        vis[now] = 1;
        for (int i = 1;i <= n;++i) {
            double disi = calc(x[now],y[now],x[i],y[i]);
            printf("%d %d %lf\n",now,i,disi);
            if (!vis[i] && disi < minn) {
                minn = disi;
                now = i;
            }
        }
        ans += minn;
        for (int i = 1;i <= n;++i) {
            double w = calc(x[now],y[now],x[i],y[i]);
            if (dis[i] > w && !vis[i]) {
                dis[i] = w;
            }
        }
        //printf("%lf\n",ans);
    }
    return ans;
}

signed main() {
    scanf("%d",&n);
    for (int i = 1;i <= n;++i) scanf("%lf %lf\n",&x[i],&y[i]);
    printf("%.2lf",Prim());
	return 0;
}
2020/8/6 11:58
加载中...