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. template<typename T>
  12. void minimize(T& a, const T& b) {
  13. if (b < a) a = b;
  14. }
  15.  
  16. const int N = 25e2 + 5;
  17.  
  18. int n, m;
  19. vector<int> adj[N];
  20. bool vis[N];
  21. int level[N];
  22.  
  23. void bfs(int s, int& ans) {
  24. memset(vis, 0, sizeof vis);
  25. memset(level, -1, sizeof level);
  26.  
  27. queue<int> q;
  28. vis[s] = true;
  29. level[s] = 0;
  30. q.push(s);
  31.  
  32. while (!q.empty()) {
  33. int u = q.front(); q.pop();
  34.  
  35. for (int v : adj[u]) {
  36. if (!vis[v]) {
  37. vis[v] = true;
  38. level[v] = level[u] + 1;
  39. q.push(v);
  40. }
  41. else if (level[v] >= level[u]) {// (level[u] == level[v] || level[u] + 1 == level[v])
  42. int cycle_len = level[u] + 1 + level[v]; // s -> u -> v -> s
  43. minimize(ans, cycle_len);
  44. }
  45. }
  46. }
  47. }
  48.  
  49. int main() {
  50. ios::sync_with_stdio(false);
  51. cin.tie(nullptr);
  52. cin >> n >> m;
  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. // Với mỗi đỉnh s từ 1 đến n ta tìm chu trình ngắn nhất đi qua s
  61. int ans = INF;
  62. for (int s = 1; s <= n; s++) bfs(s, ans);
  63.  
  64. if (ans == INF) ans = -1;
  65. cout << ans << '\n';
  66. }
Success #stdin #stdout 0s 5284KB
stdin
5 6
1 2
1 3
2 4
2 5
3 4
4 5
stdout
3