fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int MOD = 1e9 + 7;
  12.  
  13. void add(int& a, int b) {
  14. a += b;
  15. if (a >= MOD) a -= MOD;
  16. }
  17.  
  18. int n, m;
  19. int adj_mat[20][20];
  20.  
  21. int dp[1 << 20][20]; // dp[mask][i] = Số đường đi xuất phát tại đỉnh 1, đã đi qua các đỉnh trong tập mask,
  22. // mỗi đỉnh đi qua đúng một lần và kết thúc tại đỉnh i
  23.  
  24. int main() {
  25. ios::sync_with_stdio(false);
  26. cin.tie(nullptr);
  27. cin >> n >> m;
  28.  
  29. for (int i = 0; i < m; i++) {
  30. int u, v;
  31. cin >> u >> v;
  32. --u, --v;
  33. adj_mat[u][v]++;
  34. }
  35.  
  36. dp[1 << 0][0] = 1;
  37. for (int mask = 0; mask < (1 << n); mask++) {
  38. for (int u = 0; u < n; u++) {
  39. if (dp[mask][u] == 0) continue;
  40. for (int v = 0; v < n; v++) {
  41. if ((mask >> v) & 1) continue;
  42. int next_mask = mask | (1 << v);
  43. add(dp[next_mask][v], 1ll * dp[mask][u] * adj_mat[u][v] % MOD);
  44. }
  45. }
  46. }
  47.  
  48. cout << dp[(1 << n) - 1][n - 1] << '\n';
  49. }
Success #stdin #stdout 0.01s 5284KB
stdin
4 6
1 2
1 3
2 3
3 2
2 4
3 4
stdout
2