#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |