习题:Session in BSU(冰茶姬)
题目
思路
把天看做点,把人看做边
那么合法的方案只有两种,一种是奇环树,另一种就是单纯的树
如果是奇环树,那么里面的所有天都是必须选,
单纯的树就只能不选1个节点,很明显,不选天数最大的那个点
整个过程用冰茶姬进行维护即可
代码
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
using namespace std;
namespace IO
{
void read(int &x)
{
x=0;
int f=1;
char c=getchar();
while('0'>c||c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while('0'<=c&&c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
x*=f;
}
void write(int x)
{
if(x<10)
putchar(x+'0');
else
{
write(x/10);
putchar(x%10+'0');
}
}
}
namespace ufs
{
int w[2000005];
int fa[2000005];
int ty[2000005];//0表示树,1表示基环树
void makeset(int n)
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
w[i]=i;
}
}
int findset(int x)
{
if(fa[x]==x)
return x;
return fa[x]=findset(fa[x]);
}
void merge(int u,int v)
{
int a=findset(u);
int b=findset(v);
if(ty[a]&ty[b])
{
cout<<"-1";
exit(0);
}
fa[a]=b;
w[b]=max(w[b],w[a]);
ty[b]=(ty[a]|ty[b]);
}
}
using namespace ufs;
using namespace IO;
struct node
{
int u,v;
}a[1000005];
int n;
int cnt;
int unhashh[2000005];
int t[2000005];
map<int,int> f,hashh;
int main()
{
read(n);
for(int i=1,u,v;i<=n;i++)
{
read(a[i].u);
read(a[i].v);
f[a[i].u]=f[a[i].v]=1;
}
for(map<int,int>::iterator it=f.begin();it!=f.end();it++)
{
hashh[(*it).first]=++cnt;
unhashh[cnt]=(*it).first;
t[cnt]=1;
}
makeset(cnt);
for(int i=1;i<=n;i++)
{
a[i].u=hashh[a[i].u];
a[i].v=hashh[a[i].v];
}
for(int i=1;i<=n;i++)
{
if(findset(a[i].u)!=findset(a[i].v))
merge(a[i].u,a[i].v);
else
{
if(ty[findset(a[i].u)])
{
cout<<"-1";
exit(0);
}
else
ty[findset(a[i].u)]=1;
}
}
for(int i=1;i<=cnt;i++)
if(i==findset(i)&&ty[i]==0)
t[w[i]]=0;
for(int i=cnt;i>=0;i--)
if(t[i])
{
write(unhashh[i]);
break;
}
return 0;
}
/*
3
23 27
27 30
22 26
*/

浙公网安备 33010602011771号