Submission #1246836

#TimeUsernameProblemLanguageResultExecution timeMemory
1246836KindaGoodGamesAmusement Park (CEOI19_amusementpark)C++20
7 / 100
0 ms328 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int,int>

int n,m;
int mod = 998244353;
bool validate(vector<pii>& edges){
    vector<vector<int>> adj(n);

    for(int i = 0; i < m; i++){
        int a,b;
        tie(a,b) = edges[i];
        adj[a].push_back(b);
    }

    vector<int> num(n,-1), low(n,-1);
    vector<bool> inS(n);
    stack<int> S;
    int counter = 0;
    int cnt = 0;

    auto dfs = [&](int v, auto&& dfs) -> void { 
        num[v] = low[v] = counter++;
        inS[v] = true;
        S.push(v);  
        for(auto u : adj[v]){
            if(num[u] == -1) dfs(u,dfs);
            if(inS[u]) low[v] = min(low[v], low[u]); 
        }

        if(num[v] == low[v]){
            cnt++;  
            int u;
            do{
                u = S.top(); S.pop(); inS[u] = false;
            }while(u != v);
        }
    }; 

    for(int i = 0; i < n; i++){
        if(num[i] == -1) dfs(0,dfs);
    }

    return cnt == n;
}

int32_t main(){
    cin >> n >> m;
    vector<pii> edges(m); 

    for(int i = 0; i < m; i++){
        int a,b;
        cin >> a >> b;
        a--;b--;
        edges[i] = {a,b};
    }
    
    int sum = 0;

    int p2 = 1 << m;

    for(int mask = 0; mask < p2; mask++){
        int bits = 0;
        for(int i = 0; i < m; i++){
            if(mask & (1 << i)){
                swap(edges[i].first,edges[i].second);
                bits++;
            }
        }

        if(validate(edges)){
            sum += bits;
            sum %= mod;
        }else{
            // cerr <<"womp womp" << endl;
        }
        for(int i = 0; i < m; i++){
            if(mask & (1 << i)){
                swap(edges[i].first,edges[i].second);
                bits++;
            }
        }
    }

    cout << sum << endl;
}
#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...