#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500010;
using ll = long long int;
vector<int> graf[MAXN];
int n, m, a, b;
ll mask[MAXN];
ll DFS(int v, int prevv) {
ll ret = (v > a && v <= a + b) ? (1LL << (v - a - 1)) : 0;
for (int x : graf[v])
if (x != prevv)
ret |= DFS(x, v);
return ret;
}
int main() {
scanf("%d%d%d%d", &n, &m, &a, &b);
for (int i = 0; i < m; i++) {
int a;
string k;
int b;
cin >> a >> k >> b;
graf[a].push_back(b);
if (k == "--") graf[b].push_back(a);
}
for (int i = 1; i <= a; i++) {
mask[i - 1] = DFS(i, i);
}
ll out = 0;
ll mod = 1000 * 1000 * 1000 + 7;
for (ll x = 0; x < (1LL << b); x++) {
bool git = true;
for (int i = 0; i < a; i++)
if (!(mask[i] & x)) {
git = false;
break;
}
out += git;
}
printf("%lld\n", out % mod);
}
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 | #include <bits/stdc++.h> using namespace std; const int MAXN = 500010; using ll = long long int; vector<int> graf[MAXN]; int n, m, a, b; ll mask[MAXN]; ll DFS(int v, int prevv) { ll ret = (v > a && v <= a + b) ? (1LL << (v - a - 1)) : 0; for (int x : graf[v]) if (x != prevv) ret |= DFS(x, v); return ret; } int main() { scanf("%d%d%d%d", &n, &m, &a, &b); for (int i = 0; i < m; i++) { int a; string k; int b; cin >> a >> k >> b; graf[a].push_back(b); if (k == "--") graf[b].push_back(a); } for (int i = 1; i <= a; i++) { mask[i - 1] = DFS(i, i); } ll out = 0; ll mod = 1000 * 1000 * 1000 + 7; for (ll x = 0; x < (1LL << b); x++) { bool git = true; for (int i = 0; i < a; i++) if (!(mask[i] & x)) { git = false; break; } out += git; } printf("%lld\n", out % mod); } |
English