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 N = 3e3 + 5;
  12.  
  13. int n, m, k;
  14. vector<int> adj[N];
  15. set<tuple<int, int, int>> ban;
  16.  
  17. bool vis[N][N];
  18. int p[N][N];
  19.  
  20. int bfs(int prv_s, int s) {
  21. memset(vis, false, sizeof vis);
  22. memset(p, 0, sizeof p);
  23.  
  24. queue<ii> q;
  25. vis[prv_s][s] = true;
  26. p[prv_s][s] = 0;
  27. q.push({prv_s, s});
  28.  
  29. while (!q.empty()) {
  30. ii front = q.front(); q.pop();
  31. int prv_u = front.first, u = front.second;
  32.  
  33. if (u == n) return prv_u;
  34.  
  35. for (int nxt_u : adj[u]) {
  36. if (ban.count(make_tuple(prv_u, u, nxt_u))) continue;
  37. if (!vis[u][nxt_u]) {
  38. vis[u][nxt_u] = true;
  39. p[u][nxt_u] = prv_u;
  40. q.push({u, nxt_u});
  41. }
  42. }
  43. }
  44.  
  45. return -1;
  46. }
  47.  
  48. int main() {
  49. ios::sync_with_stdio(false);
  50. cin.tie(nullptr);
  51. cin >> n >> m >> k;
  52.  
  53. for (int i = 0; i < m; i++) {
  54. int u, v;
  55. cin >> u >> v;
  56. adj[u].push_back(v);
  57. adj[v].push_back(u);
  58. }
  59.  
  60. for (int i = 0; i < k; i++) {
  61. int a, b, c;
  62. cin >> a >> b >> c;
  63. ban.insert(make_tuple(a, b, c));
  64. }
  65.  
  66. int prv = bfs(0, 1);
  67. int cur = n;
  68.  
  69. if (prv == -1) {
  70. cout << -1 << '\n';
  71. return 0;
  72. }
  73.  
  74. vector<int> path;
  75. while (true) {
  76. path.push_back(cur);
  77. if (cur == 1) break;
  78. int new_prv = p[prv][cur];
  79. cur = prv;
  80. prv = new_prv;
  81. }
  82.  
  83. reverse(path.begin(), path.end());
  84.  
  85. cout << path.size() - 1 << '\n';
  86. for (int u : path) cout << u << ' ';
  87. }
Success #stdin #stdout 0.01s 47816KB
stdin
4 4 1
1 2
2 3
3 4
1 3
1 4 3
stdout
2
1 3 4