2265 - Spanning Trees

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2264

問題

解法

公式の講評の解法1の通り。
偶数の場合はn=2を元として4からスタート、奇数の場合はn=3を元として5からスタートして全域木を更新、追加していく。追加はkまで。
coutだと間に合わなそう。


何故set使ったんだろう。

ソース

typedef pair<int,int> pii;
int main() {
  int n,k;
  cin >> n >> k;
  if (2*k>n) {
    cout << -1 << endl;
    return 0;
  }
  set<pii> se[k+1];
  se[0].insert(pii(1,2));
  int start = 4;
  if (n%2) {
    se[0].insert(pii(2,3));
    start = 5;
  }
  for (int i=start; i<=n; i+=2) {
    for (int j=1; j<=min(i/2-1, k); ++j) { // 頂点の数を増やす
      se[j-1].insert(pii(i-1, j));
      se[j-1].insert(pii(i, i/2-1+j));
    }
    if (i/2<=k) { // 新たにひとつ作る
      int hoge = i/2-1;
      se[hoge].insert(pii(i-1, i));
      for (int j=1; j<=i/2-1; ++j) {
        se[hoge].insert(pii(i, j));
        se[hoge].insert(pii(i-1, i/2-1+j));
      }
      if (n%2) se[hoge].insert(pii(i-1,i-2));
    }
  }
  REP(i,k) {
    if (i)puts("");
    FOR(it, se[i]) {
      printf("%d %d\n",it->first, it->second);
    }
  }
}