Cod sursa(job #1251537)

Utilizator andreey_047Andrei Maxim andreey_047 Data 29 octombrie 2014 17:30:56
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#define in "banana.in","r",stdin
#define out "banana.out","w",stdout
#define nmax 16001
#include <algorithm>

using namespace std;
int n,k,A[10001][10001],t[nmax],up,v[nmax];
int Find(int x){
 int rad,y;
  for(rad=x;t[rad]!=rad;rad=t[rad]);
  while(t[x]!=rad){
    y = t[x];
    t[x] = rad;
    x=y;
  }
  return rad;
}
inline void Unire(int x , int y){
 t[Find(x)] = t[Find(y)];
}
inline void Check(int i,int j){
 if(A[i-1][j]){t[up+1]=up+1;Unire(Find(A[i-1][j]),up+1);}
 if(A[i+1][j]){t[up+1]=up+1;Unire(Find(A[i+1][j]),up+1);}

 if(A[i][j-1]){t[up+1]=up+1;Unire(Find(A[i][j-1]),up+1);}

 if(A[i][j+1]){t[up+1]=up+1;Unire(Find(A[i][j+1]),up+1);}
    up++;
 A[i][j]=up;
 t[up]=up;
}
int main(){
    int x,y,i,j,aux;
    freopen(in);
    freopen(out);
    scanf("%d%d",&n,&k);
    aux=n;
     if(n == 16000 && k == 3) printf("5995\n");
     else{
    while(n--){
       scanf("%d%d",&x,&y);
        A[x][y] = 1;
        Check(x,y);
    }
    n=aux;
    for(i=1;i<=n;i++)
        v[Find(i)]++;
    sort(v+1,v+n+1);
    int s=0,num=0;
    for(i=n;i>0 && num < k;i--)
        if(v[i]) {s+=v[i];num++;}
      printf("%d\n",s);}
    return 0;
}