跑完Tarjan后就傻了,50pts
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,head[20005],cnt0=0,cnt1=0,a[20005],b[20005],cnt2=0,c[20005],e[20005],ans=0x7fffffff;
stack<int> s;
bool d[20005];
struct node
{
int next,to;
} edge[400005];
void add(int from,int to)
{
edge[++cnt0]=(node){head[from],to};
head[from]=cnt0;
}
void dfs(int x)
{
int y;
a[x]=++cnt1;
b[x]=cnt1;
d[x]=1;
s.push(x);
for (int i=head[x];i;i=edge[i].next)
{
y=edge[i].to;
if (a[y]==0)
{
dfs(y);
b[x]=min(b[x],b[y]);
}
else if (d[y])
b[x]=min(b[x],a[y]);
}
if (a[x]==b[x])
{
++cnt2;
while (s.top()!=x)
{
y=s.top();
s.pop();
c[y]=cnt2;
d[y]=0;
e[x]+=e[y];
e[y]=0x7fffffff;
}
c[x]=cnt2;
d[x]=0;
s.pop();
}
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;++i)
e[i]=1;
while (m--)
{
scanf("%d%d",&x,&y);
add(x+n,y);
add(y+n,x);
add(x,y+n);
add(y,x+n);
}
for (int i=1;i<=n<<1;++i)
if (a[i]==0)
dfs(i);
for (int i=1;i<=n;++i)
if (c[i]==c[i+n])
{
puts("Impossible");
return 0;
}
for (int i=1;i<=n<<1;++i)
ans=min(ans,e[c[i]]);
cout<<ans;
}