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][v] = Số đường đi xuất phát từ thành phố 1 (Syrjälä),
  22. // đi qua tất cả các thành phố có trong mask, mỗi thành phố đúng một lần
  23. // và kết thúc tại thành phố v
  24.  
  25. int main() {
  26. ios::sync_with_stdio(false);
  27. cin.tie(nullptr);
  28. cin >> n >> m;
  29.  
  30. for (int i = 0; i < m; i++) {
  31. int u, v;
  32. cin >> u >> v;
  33. --u, --v;
  34. adj_mat[u][v]++;
  35. }
  36.  
  37. for (int mask = 0; mask < (1 << n); mask++) {
  38. for (int v = 0; v < n; v++) {
  39. int& cur = dp[mask][v];
  40. if (mask == (1 << v) && v == 0) {
  41. cur = 1;
  42. continue;
  43. }
  44. cur = 0;
  45. if (!(mask & (1 << v))) continue;
  46. for (int u = 0; u < n; u++) {
  47. int prev_mask = mask ^ (1 << v);
  48. add(dp[mask][v], 1ll * dp[prev_mask][u] * adj_mat[u][v] % MOD);
  49. }
  50. }
  51. }
  52.  
  53. cout << dp[(1 << n) - 1][n - 1] << '\n';
  54. }
Success #stdin #stdout 0.01s 5320KB
stdin
4 6
1 2
1 3
2 3
3 2
2 4
3 4
stdout
2