计算气球半径让其不相交(四)

2013-12-12 14:36:47 · 作者: · 浏览: 541

 

    for (int i = 0 ; i  < t 《 1 ; i ++ ){

    top = dp = 0 ;

    if(!dfn[i])tarjan(i) ;

    }

    for (int i = 0 ; i < t ; i ++ ){

    if(belong[LL(i)] == belong[RR(i)])return 0 ;

    }

    return 1 ;

    }

    int main() {

    while(cin 》 t){

    for (int i = 0 ; i < t ;i ++ ){

    cin 》 x[LL(i)] 》 y[LL(i)] 》 z[LL(i)] ;

    cin 》 x[RR(i)] 》 y[RR(i)] 》 z[RR(i)] ;

    }

    //        cout 《 getdis(0 ,1) 《 endl;

    double l = 0 , r = 20000 ;

    double mid ;

    while(r - l > 1e-5){

    mid = (l + r) / 2 ;

    build(mid) ;

    if(fuckit()){

    l = mid ;

    }

    else r = mid ;

    }

    double ans = mid / 2 ;//直接输出 mid / 2 就WA到死。

    char aa[222] ;//太恶心。

    sprintf(aa ,"%.3f" , ans) ;

    sscanf(aa , "%lf" ,&ans) ;

    build(ans * 2 ) ;

    if(!fuckit())ans -= 0.001 ;

    printf("%.3f\n",ans) ;

    }

    return 0 ;

    }

    HDU 3622

    两道题其实完全是一样的,不过一题是3D,一题是2D,解法完全相同,不过这题二分之后不需要判可行性了。

    #include <iostream>

    #include <cstdio>

    #include <algorithm>

    #include <string>

    #include <cmath>

    #include <cstring>

    #include <queue>

    #include <set>

    #include <vector>

    #include <stack>

    #include <map>

    #include <iomanip>

    #define PI acos(-1.0)

    #define Max 2505

    #define inf 1《28

    #define LL(x) ( x 《 1 )

    #define RR(x) ( x 《 1 | 1 )

    #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )

    #define ll long long

    #define mem(a,b) memset(a,b,sizeof(a))

    #define mp(a,b) make_pair(a,b)

    #define PII pair<int,int>

    using namespace std;

    #define N 105

    double x[N 《 1] , y[N 《 1] ;

    struct kdq{

    int e , next ;

    }ed[N * 1000] ;

    int dfn[N 《 1] ,low[N 《 1] , belong[N 《 1] ,st[N 《 1] ,inst[N 《 1] ,head[N 《 1] ;

    int dp , top , ca , num , n ;

    inline double getdis(int i ,int j){

    return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])) ;

    }

    void add(int s ,int e){

    ed[num].e = e ;

    ed[num].next = head[s] ;

    head[s] = num ++ ;

    }

    void init(){

    mem(dfn ,0) ;

    mem(low ,0) ;

    mem(st ,0) ;

    mem(head,-1) ;

    mem(belong ,0) ;

    mem(inst ,0) ;

    dp = top = ca = num = 0 ;

    }

    void build(double mid){

    init() ;

    for (int i = 0 ; i < n ; i ++ ){

    for (int j = i + 1 ; j < n ; j ++ ){

    if(getdis(LL(i) , LL(j)) < mid){

    add(LL(i) , LL(j) ^ 1) ;

    add(LL(j) , LL(i) ^ 1) ;

    }

    if(getdis(LL(i) , RR(j)) < mid){

    add(LL(i) , RR(j) ^ 1) ;

    add(RR(j) , LL(i) ^ 1) ;

    }

    if(getdis(RR(i) , LL(j)) < mid){

    add(RR(i) , LL(j) ^ 1) ;

    add(LL(j) , RR(i) ^ 1) ;

    }

    if(getdis(RR(i) , RR(j)) < mid){

    add(RR(i) , RR(j) ^ 1) ;

    add(RR(j) , RR(i) ^ 1) ;

    }

    }

    }

    }