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]
[/code]
目前为止还只能判断一个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]
相关文章推荐
- hdu 3062 Party 2-SAT入门
- hdu 3062 Party 2-SAT入门
- HDU 3062 Party 2-SAT 入门题
- HDU 3062 Party(2-SAT入门+学习)
- [hdu 3062] Party(2-sat入门)
- hdu 3062 Party【2-SAT入门---强连通Tarjan+染色缩点】
- HDU 3062 Party (2-SAT入门)
- HDU 3062 Party (2-SAT入门学习)
- hdu 3062 Party(2-sat入门)
- HDU 3062 Party 2-sat
- hdoj 3062 Party 【2-sat入门 :布尔表达式建边 有向图tarjan求SCC】 【离散没学好是硬伤】
- hdu 3062 2-Sat入门
- HDU 3062 & HDU 1824 (2-sat入门题)
- HDU 3062 Party 2-sat
- HDU 3062 Party 2-SAT
- HDU 3062 Party(2-sat)
- HDU 3062 Party(2-SAT)
- HDU 3062 Party (2-SAT模板题)
- HDU 3062 Party 2-SAT
- 2-sat入门(tarjan)hdu(3062)