poj-openjudge 1043:Bomb! 解题报告

来源:互联网 发布:淘宝黑暗之魂3 编辑:程序博客网 时间:2024/06/05 04:17

题目

2013北大校赛总结

题意:

有很多个炸弹,爆炸半径相同,如果一个爆炸那么所以在爆炸半径内的炸弹也爆炸。

现在要引爆第一个炸弹,使得某个特定的炸弹爆炸,问所需最小的爆炸半径。

解法:

二分爆炸半径,然后BFS是否能炸到要炸的。

Time:120msMemory:2364kBLength:1270 B#include <iostream>#include <cstdio>#include <queue>#include <cmath>#include <cstring>#define EPS 1e-3#define MAXN 510using namespace std;int x[MAXN],y[MAXN];double dist[MAXN][MAXN];bool vi[MAXN];bool check(double len,int n){    queue<int> que;    que.push(1);    memset(vi,0,sizeof(vi));    while(que.size())    {        int now=que.front();        if(now==0)  return true;        que.pop();        for(int i=0;i<=n;++i)            if(!vi[i]&&dist[now][i]<len+EPS)                vi[i]=1,que.push(i);    }    return false;}int main(){    //freopen("C:\\Documents and Settings\\k99\\My Documents\\input.txt","r",stdin);    int n,s,t,num;    scanf("%d",&n);    while(n--)    {        scanf("%d%d%d",&x[0],&y[0],&num);        for(int i=1;i<=num;++i)            scanf("%d%d",&x[i],&y[i]);        for(int i=0;i<=num;++i)            for(int j=0;j<=num;++j)                dist[i][j]=sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j]));        double l=0,r=1e18,mid;        while(l<r-EPS)        {            mid=(l+r)/2;            if(check(mid,num))                r=mid;            else    l=mid;        }        printf("%.2f\n",l);    }    return 0;}