Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<algorithm>
- using namespace std;
- typedef long long int ll;
- ll const inf = 1e18;
- struct pos{
- ll I;
- ll J;
- };/*
- ll abs(ll x){
- return (x < 0 ? x * -1 : x);
- }*/
- ll distM(pos a,pos b){
- return abs(a.I - b.I) + abs(a.J - b.J);
- }
- int main()
- {
- int n,k;
- scanf("%d %d",&n,&k);
- pos home[n];
- ll dist[n];
- bool visited[n];
- int myset[n];
- for(int i = 0 ; i < n ; i ++){
- scanf("%lld %lld",&home[i].I,&home[i].J);
- dist[i] = inf;
- visited[i] = false;
- myset[i] = i;
- }
- dist[0] = 0;
- ll MST = 0;
- int t = 0;
- ll edge[n];
- int bound = n - 1;
- while(true){
- //find key
- ll mindist = inf + 1, u = -1;
- int swappos;
- for(int i = 0 ; i <= bound ; i ++){
- if(dist[myset[i]] < mindist){
- mindist = dist[myset[i]];;
- u = myset[i];
- swappos = i;
- }
- }
- if(u == -1)break;
- swap(myset[swappos],myset[bound]);
- bound--;
- MST += mindist;
- edge[t++] = mindist;
- for(int i = 0 ; i <= bound ; i ++){
- ll w = distM(home[u],home[myset[i]]);
- if(w < dist[myset[i]]){
- dist[myset[i]] = w;
- }
- }
- }
- sort(edge,edge+t,greater<ll>());
- for(int i = 0 ; i < k - 1 ; i ++){
- MST -= edge[i];
- }
- printf("%lld",MST);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement