提交时间:2024-11-14 18:22:34

运行 ID: 34819

#include<bits/stdc++.h> using namespace std; #define N 3003 int n,q; pair<int,int>pos[N]; long long dis(int i,int j){ long long tmp1=abs(pos[i].first-pos[j].first), tmp2=abs(pos[i].second-pos[j].second); return tmp1*tmp1*tmp1+tmp2*tmp2*tmp2; } long long g[N][N]; struct node { int from,to; long long w; int t; bool operator<(node x) const{ return w>x.w; } }e[N]; bool cmp(node x,node y){ return x.w<y.w; } bool vis[N]; long long d[N]; long long prim(){ long long ans=0; int cnt=0; priority_queue<node>q; memset(d,0x3f,sizeof(d)); d[1]=0; q.push({0,1,0,0}); while (!q.empty()) { if(cnt==n) break; node cur=q.top(); q.pop(); if(vis[cur.to]) continue; vis[cur.to]=1; ans+=d[cur.to]; if(cnt!=0) e[cnt]=cur; cnt++; for(int i=1;i<=n;i++){ if(!vis[i] && d[i]>g[cur.to][i]){ d[i]=g[cur.to][i]; q.push({cur.to,i,d[i],0}); } } } return ans; } int fa[N]; int query(int x){ if(fa[x]==x) return x; return fa[x]=query(fa[x]); } void merge(int x,int y){ x=query(x),y=query(y); if(x==y) return; fa[x]=y; } long long kruskal(int t){ for(int i=1;i<=n;i++) fa[i]=i; long long ans=0; for(int i=1;i<n+q;i++){ if(e[i].t>t) continue; node cur=e[i]; if(query(cur.from)==query(cur.to)) continue; merge(cur.from,cur.to); ans+=cur.w; } return ans; } int main(){ //freopen("logistics.in","r",stdin); //freopen("logistics.out","w",stdout); ios::sync_with_stdio(0); cin>>n>>q; for(int i=1;i<=n;i++) cin>>pos[i].first>>pos[i].second; //for(int i=1;i<=n;i++) pos[i].first=pos[i].second=0; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ g[i][j]=g[j][i]=dis(i,j); } } cout<<prim()<<endl; for(int i=1;i<=q;i++){ int u,v; long long w; cin>>u>>v>>w; e[n+i-1]={u,v,w,i}; } sort(e+1,e+n+q,cmp); for(int i=1;i<=q;i++){ cout<<kruskal(i)<<endl; } return 0; }