您的位置:首页 > 其它

2-sat入门, hdu 3062 Party

2011-05-18 19:33 399 查看
昨天刚开始看2-sat, 强连通分量的更深层次的应用。。

目前为止还只能判断一个2-sat是否有解,还不能求出具体的解,对于后面的拓扑排序理解的不是很透彻。。

[align=left]Problem Description[/align]
有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席。在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的。有没有可能会有n 个人同时列席?

[align=left]Input[/align]
n: 表示有n对夫妻被邀请 (n<= 1000)
m: 表示有m 对矛盾关系 ( m < (n - 1) * (n -1))

在接下来的m行中,每行会有4个数字,分别是 A1,A2,C1,C2
A1,A2分别表示是夫妻的编号
C1,C2 表示是妻子还是丈夫 ,0表示妻子 ,1是丈夫
夫妻编号从 0 到 n -1

[align=left]Output[/align]
如果存在一种情况 则输出YES
否则输出 NO

[align=left]Sample Input[/align]

2
1
0 1 1 1  强连通之后加一个判断,判断每一对夫妻会不会同在一个强连通分量里面,如果是则该2-sat无解,输出NO,else 输出YES。。代码:View Code [code] # include<stdio.h>
# define N 2005
# define M 2000005
struct node{
int from,to,next;
}edge1[M],edge2[M];
int head1
,head2
,visit1
,Belong
,T
,visit2
;
int Tcnt,Bcnt,tol1,tol2;
void add(int a,int b)
{
edge1[tol1].from=a;edge1[tol1].to=b;edge1[tol1].next=head1[a];head1[a]=tol1++;
edge2[tol2].from=b;edge2[tol2].to=a;edge2[tol2].next=head2[b];head2[b]=tol2++;
}
void dfs1(int x)
{
int j;
visit1[x]=1;
for(j=head1[x];j!=-1;j=edge1[j].next)
{
if(visit1[edge1[j].to]==0) dfs1(edge1[j].to);
}
T[Tcnt++]=x;
}
void dfs2(int x)
{
int j;
visit2[x]=1;
Belong[x]=Bcnt;
for(j=head2[x];j!=-1;j=edge2[j].next)
{
if(visit2[edge2[j].to]==0) dfs2(edge2[j].to);
}
}
int main()
{
int i,n,m,a,b,c1,c2;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<=2*n;i++)
{
head1[i]=-1;
head2[i]=-1;
visit1[i]=0;
visit2[i]=0;
}
Bcnt=Tcnt=0;
tol1=0;
tol2=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&c1,&c2);
a++;
b++;
a*=2;
b*=2;
if(c1==0 && c2==0)
{
add(a-1,b);
add(b-1,a);
}
else if(c1==0 && c2==1)
{
add(a-1,b-1);
add(b,a);
}
else if(c1==1 && c2==0)
{
add(a,b);
add(b-1,a-1);
}
else
{
add(a,b-1);
add(b,a-1);
}
}
for(i=1;i<=2*n;i++)
if(visit1[i]==0) dfs1(i);
for(i=Tcnt-1;i>=0;i--)
{
if(visit2[T[i]]==0)
{
dfs2(T[i]);
Bcnt++;
}
}
for(i=1;i<=2*n-1;i+=2)
{
if(Belong[i]==Belong[i+1]) break;
}
if(i<=2*n-1) printf("NO\n");
else printf("YES\n");
}
return 0;
}


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: