CF 上第 5 个点 MLE 了
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,mst,cnt_to_zero,cnt_line;
int k[2010],c[2010];
struct Node {
int x,y;
Node() {}
Node(int a,int b) : x(a),y(b) {}
} node[2010];
int Manhatton(Node a,Node b) {
return abs(a.x - b.x) + abs(a.y - b.y);
}
struct Edge {
int u,v,w;
Edge() {}
Edge(int a,int b) : u(a),v(b) {
if (u == 0) {
w = c[v];
} else if (v == 0) {
w = c[u];
} else {
w = (k[u] + k[v]) * Manhatton(node[u],node[v]);
}
}
};
vector<Edge> edge;
vector<int> city_to_zero;
vector<Node> line;
class DSU {
int fa[2010];
public :
void init(int size) {
for (int i=0; i<=size; ++i) {
fa[i] = i;
}
}
int find(int x) {
if (x != fa[x]) {
fa[x] = find(fa[x]);
}
return fa[x];
}
void unite(int x,int y) {
fa[find(x)] = find(y);
}
} dsu;
int Kruskal() {
sort(edge.begin(),edge.end(),[](Edge a,Edge b) {
return a.w < b.w;
});
for (auto ver : edge) {
if (dsu.find(ver.u) != dsu.find(ver.v)) {
dsu.unite(ver.u,ver.v);
mst += ver.w;
if (ver.u == 0 or ver.v == 0) {
++cnt_to_zero;
city_to_zero.push_back(ver.v == 0 ? ver.u : ver.v);
} else {
++cnt_line;
line.push_back({ver.u,ver.v});
}
}
}
return mst;
}
signed main() {
scanf("%lld",&n);
dsu.init(n);
for (int i=1; i<=n; ++i) {
scanf("%lld %lld",&node[i].x,&node[i].y);
}
for (int i=1; i<=n; ++i) {
scanf("%lld",&c[i]);
}
for (int i=1; i<=n; ++i) {
scanf("%lld",&k[i]);
}
for (int i=1; i<=n; ++i) {
edge.push_back({0,i}), edge.push_back({i,0});
for (int j=1; j<=n; ++j) {
edge.push_back({i,j}), edge.push_back({j,i});
}
}
printf("%lld\n",Kruskal());
printf("%lld\n",cnt_to_zero);
for (auto city : city_to_zero) {
printf("%lld ",city);
}
printf("\n%lld\n",cnt_line);
for (auto cityline : line) {
printf("%lld %lld\n",cityline.x,cityline.y);
}
return 0;
}