hdu 3622 Bomb Game 继续2-sat
2011-05-19 20:05
260 查看
这题比较容易看出来是2-sat.
2-sat箴言:如果a与b矛盾,则添加单向边(a,b').
由题意可以看出:最好的情况是每个圆的半径都相等。
所以就可以二分枚举半径了:
对于每一个半径,用2-sat判断是否有解。
矛盾条件:圆心距小于周长的2倍。。
之后就可以直接用模板来解了:
View Code
去年成都现场赛有道题:3715 Go Deeper 也是一道2-sat题,不过不太容易看出来,至于满足矛盾条件建立边时,我到现在还不是很理解,
不知道两位学长当时是怎么看出来的。。Orz个。。 等到省赛之后,再来继续研究吧。。
后天就要去参加省赛了,心理有点小激动。。 尽管去年还去了趟成都,但那时还有学长,我就是去打酱油的,没有太大的压力。这次可不一样,这次一定不能打酱油。。。
希望大后天 RP可以baobaobao。。^_^ 。~~。
2-sat箴言:如果a与b矛盾,则添加单向边(a,b').
由题意可以看出:最好的情况是每个圆的半径都相等。
所以就可以二分枚举半径了:
对于每一个半径,用2-sat判断是否有解。
矛盾条件:圆心距小于周长的2倍。。
之后就可以直接用模板来解了:
View Code
# include<stdio.h> # include<math.h> # define N 205 # define M 40005 struct node{ int x,y; }s ; struct node1{ int from,to,next; }edge1[M],edge2[M]; int visit1 ,visit2 ,head1 ,head2 ,Belong ,T ; int tol1,tol2,Bcnt,Tcnt; 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); } double dist(int x1,int y1,int x2,int y2) { return sqrt((x1 -x2)*(x1-x2) + (y1-y2)*(y1-y2)); } int main() { int i,j,n,ans; double left,right,mid,Max,ans1; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d%d%d%d",&s[2*i-1].x,&s[2*i-1].y,&s[2*i].x,&s[2*i].y); right=20000*sqrt(2); left=0; Max=0; while(right - left>=1e-4) { mid=(right+left)/2; for(i=0;i<=2*n;i++) { head1[i]=-1; head2[i]=-1; visit1[i]=0; visit2[i]=0; } tol1=tol2=Bcnt=Tcnt=0; for(i=1;i<2*n-1;i++) { if(i%2==1) ans=i+2; else ans=i+1;; for(j=ans;j<=2*n;j++) { ans1=dist(s[i].x,s[i].y,s[j].x,s[j].y); if(ans1 < 2*mid ) { if(i%2==0 && j%2==0) { add(i,j-1); add(j,i-1); } else if(i%2==0 && j%2==1) { add(i,j+1); add(j,i-1); } else if(i%2==1 && j%2==0) { add(i,j-1); add(j,i+1); } else { add(i,j+1); add(j,i+1); } } //if }//for }//for 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) right=mid -(1e-4); else {Max=mid;left=mid+(1e-4);} } printf("%.2lf\n",Max); } return 0; }
去年成都现场赛有道题:3715 Go Deeper 也是一道2-sat题,不过不太容易看出来,至于满足矛盾条件建立边时,我到现在还不是很理解,
不知道两位学长当时是怎么看出来的。。Orz个。。 等到省赛之后,再来继续研究吧。。
后天就要去参加省赛了,心理有点小激动。。 尽管去年还去了趟成都,但那时还有学长,我就是去打酱油的,没有太大的压力。这次可不一样,这次一定不能打酱油。。。
希望大后天 RP可以baobaobao。。^_^ 。~~。
相关文章推荐
- 2-sat->HDU 3622 Bomb Game
- POJ 2723 && HDU 1816 Get Luffy Out(2-SAT+二分)
- HDU 3062 Party(2-sat 模板题 tarjan )
- hdu 3622 二分+2-SAT判定
- hdu 4115 2-SAT判定
- HDU 3622 2_SAT
- HDU 4421 Bit Magic[2_sat]
- [HDU1814]Peaceful Commission(2-SAT)
- hdu-3062(2-SAT入门)
- HDU 1824 Let's go home (2-SAT)
- [2-SAT][POJ2683][HDU1814]2-SAT两种模板
- hdu 3062 基础的2sat
- HDU 4421 Bit Magic 【2-SAT】
- hdu 3602 Party (2-sat)
- 【2-SAT】 HDU 4421 Bit Magic
- HDU 3622 Bomb Game (二分+2-sat,4级 )
- HDU 4751 Divide Groups (2-SAT)
- hdu 4115 Eliminate the Conflict (3-sat ??? no! it's a 2-sat pro.)
- HDU 3622 Bomb Game(2-SAT)
- HDU 3622 Bomb Game(二分 + 2-SAT)