//Marcin Knapik, PA2019, Dzień 4, Zadanie "Wyspa"[A]
//złożoność O(2^n)
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
int a, b, n, m;
#define pb push_back
const int N = 1e6+7;
bool odw[N];
int gdzie[N];
int akt;
vector<int> dotk;
vector<vector<int>> G(N);
void dfs(int start){
if(start > a && start <= a + b)
gdzie[akt] |= (1<<(start - a - 1));
dotk.pb(start);
odw[start] = 1;
for(auto&u:G[start])
if(!odw[u])
dfs(u);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> a >> b;
for(int i = 0; i < m; i++){
int x, y;
string p;
cin >> x >> p >> y;
if(p == "->"){
G[x].pb(y);
}
else{
G[x].pb(y);
G[y].pb(x);
}
}
for(int i = 1; i <= a; i++){
akt = i;
dfs(i);
for(auto&u:dotk)
odw[u] = 0;
dotk.clear();
}
int ans = 0;
for(int i = 0 ; i < (1<<b); i++){
bool ok = 1;
for(int j = 1; j <= a; j++)
if(!(i&gdzie[j]))
ok = 0;
if(ok)
ans++;
}
cout << ans << '\n';
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | //Marcin Knapik, PA2019, Dzień 4, Zadanie "Wyspa"[A] //złożoność O(2^n) #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> using namespace std; int a, b, n, m; #define pb push_back const int N = 1e6+7; bool odw[N]; int gdzie[N]; int akt; vector<int> dotk; vector<vector<int>> G(N); void dfs(int start){ if(start > a && start <= a + b) gdzie[akt] |= (1<<(start - a - 1)); dotk.pb(start); odw[start] = 1; for(auto&u:G[start]) if(!odw[u]) dfs(u); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> a >> b; for(int i = 0; i < m; i++){ int x, y; string p; cin >> x >> p >> y; if(p == "->"){ G[x].pb(y); } else{ G[x].pb(y); G[y].pb(x); } } for(int i = 1; i <= a; i++){ akt = i; dfs(i); for(auto&u:dotk) odw[u] = 0; dotk.clear(); } int ans = 0; for(int i = 0 ; i < (1<<b); i++){ bool ok = 1; for(int j = 1; j <= a; j++) if(!(i&gdzie[j])) ok = 0; if(ok) ans++; } cout << ans << '\n'; } |
English