1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; #define LL long long const int CN = 2010; class fs{ public: int fr,to; LL di; void init(int f,int t,LL d) {fr=f;to=t;di=d;} bool operator < (const fs& a)const {return di < a.di;} }E[CN * CN]; int ecnt = 0; void add(int x,int y,LL z) {E[++ecnt].init(x,y,z);} class ufs{ public: int fa[CN]; ufs() {for(int i=1;i<CN;i++) fa[i] = i;} int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);} bool exm(int x,int y) {return find(x) != find(y);} void merge(int x,int y) {fa[find(x)] = find(y);} }ck; int n,px[CN],py[CN],pc[CN],pk[CN]; int abs(int x) {return x<0 ? -x : x;} int dist(int a,int b) {return abs(px[a] - px[b]) + abs(py[a] - py[b]);} bool sel[CN * CN]; LL si = 0; void MST(){ memset(sel,false,sizeof(sel)); sort(E+1,E+ecnt+1); int cnt = 0; for(int i=1;i<=ecnt;i++){ if(!ck.exm(E[i].fr, E[i].to)) continue; ck.merge(E[i].fr, E[i].to); cnt++; si += E[i].di; sel[i] = true; if(cnt == n - 1) break; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&px[i],&py[i]); for(int i=1;i<=n;i++) scanf("%d",&pc[i]); for(int i=1;i<=n;i++) scanf("%d",&pk[i]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) add(i,j,1ll*(pk[i]+pk[j])*dist(i,j)); for(int i=1;i<=n;i++) add(i,n+1,pc[i]); n += 1; MST(); printf("%I64d\n",si); int cnt = 0; for(int i=1;i<=ecnt;i++) if(sel[i] && E[i].to == n) cnt++; printf("%d\n",cnt); for(int i=1;i<=ecnt;i++) if(sel[i] && E[i].to == n) printf("%d ",E[i].fr); printf("\n"); cnt = n - 1 - cnt; printf("%d\n",cnt); for(int i=1;i<=ecnt;i++) if(sel[i] && E[i].to != n) printf("%d %d\n",E[i].fr,E[i].to); return 0; }
|