Run Time: 0.009
Ranking (as of 2016-01-16): 64 out of 547
Language: C++
/* UVa 10765 - Doves and bombs To build using Visual Studio 2012: cl -EHsc -O2 UVa_10765_Doves_and_bombs.cpp */ #include <algorithm> #include <vector> #include <cstdio> using namespace std; const int n_max = 10000; vector<int> edges[n_max]; struct state { bool visited_; int parent_; int discovery_; int earliest_; // time of earliest visited vertex reachable from the subtree // rooted with this vertex state() : parent_(-1), discovery_(-1), earliest_(-1) {} } states[n_max]; struct pigeon_value { int i_, values_; bool operator<(const pigeon_value& pv) const { return (values_ != pv.values_) ? values_ > pv.values_ : i_ < pv.i_; } } pigeon_values[n_max]; void find_articulation_points(int u, int t) { states[u].visited_ = true; states[u].discovery_ = states[u].earliest_ = t; const vector<int>& es = edges[u]; int nr_children = 0; for (size_t i = 0, e = es.size(); i < e; i++) { int v = es[i]; if (!states[v].visited_) { nr_children++; states[v].parent_ = u; find_articulation_points(v, t + 1); states[u].earliest_ = min(states[u].earliest_, states[v].earliest_); if (states[u].parent_ == -1 && nr_children > 1 || states[u].parent_ != -1 && states[v].earliest_ >= states[u].discovery_) { #ifdef DEBUG printf("articulation point = %d\n", u); #endif pigeon_values[u].values_++; } } else if (v != states[u].parent_) states[u].earliest_ = min(states[u].earliest_, states[v].discovery_); } #ifdef DEBUG printf("%d: parent = %d, discovery = %d, earliest = %d\n", u, states[u].parent_, states[u].discovery_, states[u].earliest_); #endif } int main() { while (true) { int n, m; scanf("%d %d", &n, &m); if (!n) break; for (int i = 0; i < n; i++) { edges[i].clear(); states[i].visited_ = false; states[i].parent_ = states[i].discovery_ = states[i].earliest_ = -1; pigeon_values[i].i_ = i; pigeon_values[i].values_ = 1; } while (true) { int x, y; scanf("%d %d", &x, &y); if (x == -1) break; edges[x].push_back(y); edges[y].push_back(x); } find_articulation_points(0, 0); sort(pigeon_values, pigeon_values + n); for (int i = 0; i < m; i++) printf("%d %d\n", pigeon_values[i].i_, pigeon_values[i].values_); putchar('\n'); } return 0; }
No comments:
Post a Comment