/* 把每个同学看成一个点,信息的传递就是在他们之间连有向边,游戏轮数就是求最小环。 图论求最小环,我在里面看到了并查集。 假如说信息由A传递给B,那么就连一条由A指向B的边,同时更新A的父节点,A到它的父节点的路径长也就是B到它的父节点的路径长+1。 这样我们就建立好了一个图,之后信息传递的所有环节都按照这些路径。游戏结束的轮数,也就是这个图里最小环的长度。 如果有两个点祖先节点相同,那么就可以构成一个环,长度为两个点到祖先节点长度之和+1。 */ #include <stdio.h> #include <iostream> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <string> #include <vector> #include <set> #include <map> #include <queue> #include <algorithm> #include <queue> #include <stack> #include <iomanip> #include <bits/stdc++.h> using namespace std; #define pb push_back typedef pair<int,int> pii; typedef long long ll; typedef unsigned long long ull; typedef double ld; typedef long double lld; typedef vector<int> vi; #define lowbit(x) (x&-x) #define fi first #define se second #define fin freopen("1.txt","r",stdin); #define fout freopen("1.txt","w",stdout); ll mod = 1000000007; const int maxn = 1000000; inline int Read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n, m; int father[maxn + 5]; int dis[maxn + 5]; int ans; int fa(int x) { if(father[x] != x) { int last = father[x]; father[x] = fa(father[x]); dis[x] += dis[last]; } return father[x]; } void check(int a, int b) { int x = fa(a); int y = fa(b); if(x != y) { father[x] = y; dis[a] = dis[b] + 1; } else { ans = min(ans, dis[a] + dis[b] + 1); } } int main() { scanf("%d", &n); ans = n; for(int i = 1; i <= n; i++) { father[i] = i; } int x; int u, v; for(int i = 1; i <= n; i++) { scanf("%d%d", &u, &v); check(u, v); } printf("%d\n", ans); return 0; }