グラフにする。
強連結成分分解して、頂点の入次数を見る。
強連結成分分解のコードは省略。だいたいスパソと同じ。
int main(int argc, char *argv[]) { int tc; cin >> tc; while (tc--) { int n; cin >> n; double x[n], y[n], a[n]; for (int i = 0; i < n; ++i) { cin >> x[i] >> y[i] >> a[i]; } Graph g(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (max(fabs(x[i] - x[j]), fabs(y[i] - y[j])) <= a[i] / 2.0) { g[i].push_back(Edge(i, j)); } } } vector< vector<int> > scc = SCC(g); map<int, int> rename; for (int i = 0; i < scc.size(); ++i) { for (int j = 0; j < scc[i].size(); ++j) { rename[scc[i][j]] = i; } } int degree[scc.size()]; fill(degree, degree + scc.size(), 0); for (int i = 0; i < g.size(); ++i) { for (int j = 0; j < g[i].size(); ++j) { int src = rename[g[i][j].src]; int dst = rename[g[i][j].dst]; if (src != dst) ++degree[dst]; } } cout << count(degree, degree + scc.size(), 0) << endl; } return 0; }
0 件のコメント :
コメントを投稿