https://atcoder.jp/contests/abc166/tasks/abc166_c
解説
https://atcoder.jp/contests/abc166/submissions/12777268
今回の問題が解けなかった場合は、この問題よりも競プロにおけるdfsの書き方を学ぶことをお勧めする。
そちらの方が資料が多いためだ。
そちらの解き方が分かっていれば、この問題を解くのは難しくない。
各頂点について、そこから遷移できる頂点について、標高の高さを比較する愚直解法を書けばいい。
教育的な部分があるとすると、無向グラフの辺表現であろう。
隣接行列での表現と、隣接リストでの表現の2種類がある。
dfsを学んだ人は、そもそも隣接行列についてはしらないように思うので、普通にdfsするように解法を作ればいい。
隣接グラフを使ってdfsをすると計算量はO(M)となるので、間に合う。
(ちなみに隣接行列でやると、O(N2)となってしまう)
int N, M, H[101010]; vector<int> E[101010]; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N >> M; rep(i, 0, N) cin >> H[i]; rep(i, 0, M) { int a, b; cin >> a >> b; a--; b--; E[a].push_back(b); E[b].push_back(a); } int ans = 0; rep(cu, 0, N) { bool ok = true; fore(to, E[cu]) if (H[cu] <= H[to]) ok = false; if (ok) ans++; } cout << ans << endl; }