Pagini recente » Cod sursa (job #919461) | Cod sursa (job #1207293) | Cod sursa (job #2049919) | Cod sursa (job #2679141) | Cod sursa (job #918784)
Cod sursa(job #918784)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#define NMax 1005
#define LogMax 11
using namespace std;
typedef vector <int> :: iterator vii; vector <int> T[NMax], Node, SC;int N, M, Level[NMax], A[LogMax][NMax], Log[NMax], V[NMax], S;bool IsC[NMax]; inline bool Compare (const int &a, const int &b){ return Level[a]>Level[b];} inline void DFS (int X, int F){ Level[X]=Level[F]+1; A[0][X]=F; for (vii Y=T[X].begin (); Y!=T[X].end (); ++Y) { if (*Y!=F) DFS (*Y, X); }} void BuildLog (){ for (int i=2; i<=N; ++i) Log[i]=Log[i/2]+1;} void BuildA (){ BuildLog (); for (int i=1; i<=Log[N]; ++i) { for (int X=1; X<=N; ++X) { A[i][X]=A[i-1][A[i-1][X]]; } }} inline int FindA (int X, int K){ int Y=X; for (int Step=Log[N]; Step>=0; --Step) { if ((1<<Step)<=K) K-=(1<<Step), Y=A[Step][Y]; } if (!Y) Y=1; return Y;} inline void MarkDFS (int X, int K){ if (!K) return; V[X]=K; for (vii Y=T[X].begin (); Y!=T[X].end (); ++Y) { if (K-1>V[*Y]) MarkDFS (*Y, K-1); }} inline bool Possible (int K){ memset (V, 0, sizeof (V)); vector <int> Center; for (vii X=Node.begin (); X!=Node.end (); ++X) { if (!V[*X]) Center.push_back (FindA (*X, K)), MarkDFS (FindA (*X, K), K+1); if ((int)Center.size ()>M) return false; } S=K; SC=Center; return true;} void BSearch (){ int L=0, R=N/M+1; while (L<=R) { int Mid=(L+R)/2; if (Possible (Mid)) R=Mid-1; else L=Mid+1; }} void BuildS (){ for (vii X=SC.begin (); X!=SC.end (); ++X) IsC[*X]=true, --M; for (int X=1; X<=N; ++X) { if (M and !IsC[X]) SC.push_back (X), --M; } sort (SC.begin (), SC.end ());} void Solve (){ DFS (1, 0); Level[0]=-N; sort (Node.begin (), Node.end (), Compare); BuildA (); BSearch (); BuildS ();} void Read (){ freopen ("salvare.in", "r", stdin); scanf ("%d\n%d", &N, &M); for (int X=1; X<=N; ++X) Node.push_back (X); for (int i=1; i<N; ++i) { int X, Y; scanf ("%d %d", &X, &Y); T[X].push_back (Y); T[Y].push_back (X); }} void Print (){ freopen ("salvare.out", "w", stdout); printf ("%d\n", S); for (vii X=SC.begin (); X!=SC.end (); ++X) { printf ("%d ", *X); } printf ("\n");} int main (){ Read (); Solve (); Print (); return 0;}