您的位置:首页 > 其它

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

# 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。。^_^ 。~~。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: