Hatena::Grouptopcoder

naoya_t@topcoder RSSフィード

2008-12-24SRM431

SRM410 Div1 Easy: AddElectricalWires

| 18:07 | SRM410 Div1 Easy: [http://www.topcoder.com/stat?c=problem_statement&pm=8817&rd=12182:title=AddElectricalWires] - naoya_t@topcoder を含むブックマーク はてなブックマーク - SRM410 Div1 Easy: [http://www.topcoder.com/stat?c=problem_statement&pm=8817&rd=12182:title=AddElectricalWires] - naoya_t@topcoder SRM410 Div1 Easy: [http://www.topcoder.com/stat?c=problem_statement&pm=8817&rd=12182:title=AddElectricalWires] - naoya_t@topcoder のブックマークコメント

これ250点問題だけどちょっと難しい。サンプルケースが通った程度では安心できない。通過率も53.71%でMediumより低い。

  • gridに繋がっているノードをまとめる
    • いちばん多く繋がっているgridはどれか
  • gridに繋がっていないノードは全て、いちばん多く繋がっているgridに繋げる
  • 各gridについて、同じgridに繋がるノードは全て繋ぐ
  • 最初からあるコネクションの数を引く
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

#define tr(c,i)  for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n)  for(int var=0;var<(n);var++)

class AddElectricalWires {
  vector<vector<bool> > w;
  vector<int> gC;
  int nw, ngc;

  void turn(int orig,int dest) {
    rep(i,nw) if (gC[i]==orig) gC[i]=dest;
  }

public:
  int all_connections(int n) { return (n>=2) ? n*(n-1)/2 : 0; }
    
  int maxNewWires(vector<string> wires, vector<int> gridConnections) {
    nw = wires.size(); // 1-50
    ngc = gC.size(); // 1-50

    gC.resize(nw); rep(i,nw) gC[i]=-i-1;
    tr(gridConnections,it) gC[*it]=*it;

    int conn = 0;
    w.resize(nw); tr(w,it) it->resize(nw);
    rep(i,nw) rep(j,nw) {
      w[i][j] = (wires[i][j]=='1');
      if (i<j && w[i][j]) {
        conn++;
        turn(min(gC[i],gC[j]), max(gC[i],gC[j]));
      }
    }
    rep(i,nw) if (gC[i]<0) gC[i] = -1;

    vector<int> count(nw+1,0);
    rep(i,nw) count[1+gC[i]]++;

    int maxc = 0, maxc_at = -1;
    for (int i=1;i<=nw;i++)
      if (count[i] > maxc) {
        maxc = count[i]; maxc_at = i;
      }
    if (maxc_at < 0) {
      return all_connections(nw) - conn;
    } else {
      count[maxc_at] += count[0];
      int ans = 0;
      for (int i=1;i<=nw;i++) ans += all_connections(count[i]);
      return ans - conn;
    }
  }
};