TopCoder SRM 682 Div1 Easy: SmilesTheFriendshipUnicorn

,

何かあるのかなと思って時間を溶かした結果、特に何もなかった。

[Easy: SmilesTheFriendshipUnicorn]()

問題

連結グラフが与えられる。長さ$4$の道$P_5$の存在を判定せよ。

解法

単に各点からdfsすればよい。

実装

#include <bits/stdc++.h>
#include <functional>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
using namespace std;
class SmilesTheFriendshipUnicorn { public: string hasFriendshipChain(int N, vector<int> A, vector<int> B); };
string SmilesTheFriendshipUnicorn::hasFriendshipChain(int n, vector<int> a, vector<int> b) {
    vector<vector<int> > g(n);
    repeat (i, a.size()) {
        g[a[i]].push_back(b[i]);
        g[b[i]].push_back(a[i]);
    }
    vector<int> used;
    function<bool (int)> dfs = [&](int i) {
        used.push_back(i);
        if (5 <= used.size()) return true;
        for (int j : g[i]) {
            if (not count(used.begin(), used.end(), j)) {
                if (dfs(j)) return true;
            }
        }
        used.pop_back();
        return false;
    };
    bool ans = false;
    repeat (i,n) {
        if (dfs(i)) { ans = true; break; }
    }
    return ans ? "Yay!" : ":(";
}