关于2-SAT
查看原帖
关于2-SAT
866613
sansesantongshun楼主2024/2/25 22:05

跑完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;
}
2024/2/25 22:05
加载中...