#include #include #include #include using namespace std; const int MAXN = 100 * 1000 + 10; const int INF = 1<<30; // بینهایت bool mark[MAXN]; vector adj[MAXN]; // لیست مجاورت رأس‌ها int depth[MAXN]; // ارتفاع هر رأس int parent[MAXN]; // پدر هر رأس int n; // تعداد رأس ها توجه کنید شماره رأس‌ها از ۰ شروع می‌شود int m; // تعداد یال‌ها int bfs(int v, int max_depth) { queue q; // صفی که رأس‌ها در آن قرار می‌گیریند memset(depth, -1, sizeof(depth)); memset(mark, 0, sizeof(mark)); mark[v] = 1; depth[v] = 0; q.push(v); while(q.size()) { v = q.front(); q.pop(); if (depth[v] == max_depth) // دوری که در آینده پیدا می‌شود نمی‌تواند کمینه باشد return INF; for(unsigned int i = 0; i < adj[v].size(); i++) { int u = adj[v][i]; if (mark[u] == 1 && u != parent[v]) // پس دور پیدا شده است return (depth[v]+1) + depth[u]; // ارتفاع قبلی پیدا شده برای این رأس + ارتفاع الان پیدا شده mark[u] = 1; q.push(u); parent[u] = v; depth[u] = depth[v] + 1; // ارتفاع همسایه یک واحد بیشتر از ارتفاع این رأس است } } return INF; } int find_min_cycle() { int dist = INF; // تقریبا بینهایت برای اینکه در کمینه تاثیری نگذارد و دور را نگه می‌دارد for (int i = 0; i < n; i++) dist = min(dist, bfs(i, dist/2)); return dist; } void input() { cin >> n >> m; for (int i = 0; i < m; i++) { int v, u; cin >> v >> u; adj[--v].push_back(--u); adj[u].push_back(v); } } int main() { input(); cout << find_min_cycle() << endl; }