제출 #1346170

#제출 시각아이디문제언어결과실행 시간메모리
1346170i_love_springAmusement Park (CEOI19_amusementpark)C++20
19 / 100
3094 ms440 KiB
#include <bits/stdc++.h>

using namespace std;

#define ar array
#define ll long long 
const int inf = 1e9;

const int mod = 998244353;

void solve() {
    int n, m;
    cin >> n >> m;
    vector<set<int>> g(n);
    vector<ar<int, 2>> edges(m);
    for (int i = 0; i < m;i++)  {
        int u, v;
        cin >> u >> v;
        --u, --v;
        g[u].insert(v);
        edges[i] = {u, v};
    }


    auto check = [&]() {
        vector<int> deg(n, 0);
        for (int i = 0; i < n;i++)
            for (int j : g[i])
                deg[j]++;

        queue<int> q;
        for (int i = 0; i < n;i++)
            if (deg[i] == 0)
                q.push(i);
        int cnt = 0;
        while (!q.empty()) {
            int u = q.front();
            q.pop();
            for (int v : g[u]) {
                deg[v]--;
                if (deg[v] == 0)
                    q.push(v);
            }
            ++cnt;
        }

        return cnt == n;
    };

    ll ans = 0;

    for (int mask = 0; mask < (1 << m); mask++) {
        vector<int> vc;
        for (int i = 0; i < m;i++) {
            if (mask >> i & 1) 
                vc.push_back(i);
        }

        for (int x : vc) {
            auto [u, v] = edges[x];
            g[u].erase(v);
            g[v].insert(u);
        }

        if (check())
            (ans += __builtin_popcount(mask)) %= mod;
        
        for (int x : vc) {
            auto [u, v] = edges[x];
            g[u].insert(v);
            g[v].erase(u);
        }
        
    }

    cout << ans;

}

int32_t main() { 

#ifdef Behruz
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif 

    ios :: sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...