朴素 prim MLE 求调

P1265 公路修建

@[Running_a_way](/user/693428) 可能是你数组开大了,你 $g$ 数组完全可以用一个函数来代替的
by _zzzzzzy_ @ 2023-08-19 19:35:17


@[zhangzhengyan0831](/user/715244) 啊?怎么写
by Running_a_way @ 2023-08-19 19:42:23


@[Running_a_way](/user/693428) 你不是完全图吗,你邻接矩阵写了跟没写一样,因为你的边的权值可以 $O(1)$ 算出来
by _zzzzzzy_ @ 2023-08-19 19:43:44


@[Running_a_way](/user/693428) 大概是这样 ```cpp //邻接矩阵 #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 g(int i, int j) { return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); } 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\n", prim()); return 0; } ```
by _zzzzzzy_ @ 2023-08-19 19:44:17


好的谢谢
by Running_a_way @ 2023-08-19 19:44:21


@[zhangzhengyan0831](/user/715244) 已 A,感谢。 此贴终。
by Running_a_way @ 2023-08-19 19:58:12


|