版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/81840853
全世界都在考基环树系列,一场CF考了两题基环树。。。。。。
AC Code:
#include<cstdio>
#include<cstring>
#include<cctype>
#include<vector>
#include<cmath>
#include<algorithm>
#define maxn 2000005
#define LL long long
#define mod 998244353
using namespace std;
int n,a[maxn],b[maxn],num[maxn*2];
int info[maxn*2],Prev[maxn*2],to[maxn*2],cnt_e;
inline void Node(int u,int v){Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v;}
bool vis[maxn];
int siz,edge,Max,sMax;
void dfs(int now)
{
if(vis[now]) return;
if(now > Max) sMax = Max , Max = now;
else if(now > sMax) sMax = now;
vis[now]=1;
siz++;
for(int i=info[now];i;i=Prev[i])
{
edge++;
dfs(to[i]);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]),num[++num[0]] = a[i] , num[++num[0]] = b[i];
sort(num+1,num+1+num[0]);
num[0] = unique(num+1 , num+1+num[0]) - num - 1;
for(int i=1;i<=n;i++)
a[i] = lower_bound(num+1,num+1+num[0],a[i])-num,
b[i] = lower_bound(num+1,num+1+num[0],b[i])-num,
Node(b[i],a[i]),Node(a[i],b[i]);
int ans = 0 ;
for(int i=num[0];i>=1;i--)
if(!vis[i])
{
sMax=Max=siz=edge=0;
dfs(i);
if(edge / 2 > siz){puts("-1");return 0;}
else if(edge / 2 == siz) ans = max(ans , Max);
else ans = max(ans , sMax);
}
printf("%d\n",num[ans]);
}