Cod sursa(job #55373)

Utilizator dominoMircea Pasoi domino Data 27 aprilie 2007 10:46:11
Problema Salvare Scor Ascuns
Compilator cpp Status done
Runda Marime 2.05 kb
#include <stdio.h>

int N, K, list[1000][1000], degree[1000], bst;
int queue[1000], dist[1000], up[1000], used[1000];

void read()
{
     FILE *f;
     int i, j, k;

     f = fopen("salvare.in", "r");
     fscanf(f, "%d\n", &N);
     fscanf(f, "%d\n", &K);
     for (k = 1; k < N; k++)
     {
          fscanf(f, "%d %d\n", &i, &j);
          i--; j--;
          list[i][degree[i]++] = j;
          list[j][degree[j]++] = i;
     }
     fclose(f);
}

void DFS(int i)
{
     int j;

     for (j = 0; j < degree[i]; j++)
         if (list[i][j] != up[i])
            up[list[i][j]] = i,
            DFS(list[i][j]);
}

int compute(int M)
{
     int i, head = 0, tail = 0;
     int deg[1000], num = 0;

     for (i = 0; i < N; i++)
         queue[i] = used[i] = 0,
         dist[i] = 6666, deg[i] = degree[i];

     for (i = 0; i < N; i++)
         if (deg[i] == 1) queue[tail++] = i, dist[i] = M;

     for (; head < tail; head++)
     {
          i = queue[head];
          if (!dist[i])
             used[i] = 1, num++,
             dist[i] = M + 1;
          deg[i]--; deg[up[i]]--;
          if (deg[up[i]] == 1)
              queue[tail++] = up[i];
          if (dist[up[i]] > dist[i] - 1)
              dist[up[i]] = dist[i] - 1;
     }
     if (dist[0] && !num) num++;

     return num;
}

void solve()
{
     int l, r, m;

     DFS(0);
     for (l = 1, r = N; l < r; )
     {
          m = (l + r) >> 1;
          if (compute(m) <= K)
             r = m;
          else
             l = m + 1;
     }
     bst = l;
}

void write()
{
     FILE *f;
     int i, count = 0;

     f = fopen("salvare.out", "w");
     fprintf(f, "%d\n", bst);
     compute(bst);
     for (i = 0; i < N; i++)
         if (used[i]) count++;
     for (i = 0; i < N; i++)
         if (!used[i] && count < K)
            used[i] = 1,
            count++;
     for (i = 0; i < N; i++)
         if (used[i]) fprintf(f, "%d ", i + 1);
     fclose(f);
}

int main()
{
     read();
     solve();
     write();
     return 0;
}