zoukankan      html  css  js  c++  java
  • Bomb Game HDU

    原题链接

    • 题解:注意建立边
    • 代码:
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    
    using namespace std;
    const int N = 5e3 + 9;
    const int M = N*2*N;
    int h[N], ne[M], to[M], idx;
    void add(int u, int v) {
        ne[idx] = h[u], to[idx] = v, h[u] = idx++;
    }
    int dfn[N], low[N], times;
    int sz[N], id[N], scc_cnt;
    int stk[N], instk[N], top;
    void tarjan(int u) {
        dfn[u] = low[u] = times++;
        stk[++top] = u;
        instk[u]= 1;
        for (int i = h[u]; ~i; i = ne[i]) {
            int v = to[i];
            if (!dfn[v]) {
                tarjan(v);
                low[u] = min(low[u], low[v]);
            } else if (instk[v]) {
                low[u] = min(low[u], dfn[v]);
            }
        }
        if (low[u] == dfn[u]){
            scc_cnt++;
            while (1) {
                int v = stk[top];
                top--;
                instk[v] = 0;
                id[v] = scc_cnt;
                sz[scc_cnt] ++;
                if (v == u)break;
            }
        }
    }
    int n, m;
    struct Point {
        double x, y;
        Point() : x(), y() {}
        Point (double x, double y):x(x), y(y){}
        Point operator-(Point a) {
            return Point(x - a.x, y - a.y);
        }
        double dis() {
            return (x*x + y*y);
        }
    }p[3][N];
    bool check(double mid) {
        memset(h, -1, sizeof h);
        idx = 0;
        memset(dfn, 0, sizeof dfn);
        scc_cnt = 0;
        times = 0;
        for (int i = 1; i <= n; i ++) {
            for (int j = 1; j <= n; j ++) {
                if (i == j)continue;
                for (int k = 0; k < 2; k ++) {
                    for (int kk = 0; kk < 2; kk ++) {
                        Point v1 = p[k][i] - p[kk][j];
                        if (v1.dis() < mid * mid) { 
                           add(i +k*n, j+ (kk^1) * n);//建边的时候要注意,必须是如果当前不满足,那么就连对面。
                           
                        }
                    }
                }
            }
        }
        for (int i = 1; i <=2* n; i ++) {
            if (!dfn[i]) {
                tarjan(i);
            }
        }
        for (int i = 1; i <= n; i ++) {
            if (id[i] == id[i + n]) {
                return 0;
            }
        }
        return 1;
    }
    void solve() {
        for (int i = 1; i <= n; i ++) {
            scanf("%lf%lf%lf%lf",&p[0][i].x, &p[0][i].y, &p[1][i].x, &p[1][i].y);
        }
        double l = 0, r = 20000;
        int TT = 40;
        while (l < r && TT--) {
            double mid = (l + r)/2;
            if (check(mid)) {
                l = mid + 0.0000001;
            } else r = mid;
        }
        printf("%.2f
    ", l*0.5);
    }
    int main() {
        while (~scanf("%d", &n)) {
            solve();
        }
    }
    
  • 相关阅读:
    webpack4笔录
    在Salesforce中进行Report和Dashboard的配置
    在Salesforce中以PDF的格式显示对应的页面
    在Salesforce中处理Email的发送
    在Visualforce page中用自带的控件实现Ajax回调后台方法(并且可以用js去动态给parameters赋值)
    javascript settimeout and setinterval
    Convert XML to Object using LINQ
    Convert Object to XML using LINQ
    JS对Array进行自定制排序
    在Salesforce中通过 Debug Log 方式 跟踪逻辑流程
  • 原文地址:https://www.cnblogs.com/Xiao-yan/p/14643438.html
Copyright © 2011-2022 走看看