zoukankan      html  css  js  c++  java
  • Poj 1556 The Doors 计算几何+最短路

    其实本题非常的无脑,无脑拍完1A,写到blog里只因为TM无脑拍也拍了很久啊= =

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <list>
    #include <set>
    #include <queue>
    #include <stack>
    #include <sstream>
    
    using namespace std;
    
    typedef long long LL;
    const int maxn = 2000;
    const int maxm = 2000 * 2000; 
    const double INF = 1e30;
    const double eps = 1e-7;
    struct Point {
        double x,y;
        Point(double x = 0,double y = 0):x(x),y(y) {}
    };
    
    Point str(0,5),end(10,5);
    vector<Point> p,pw;
    double dist[maxn][maxn],d[maxn];
    int N,M;
    
    int dcmp(double x) {
        if(fabs(x) < eps) return 0;
        if(x < 0) return -1;
        return 1;
    }
    
    Point operator - (Point a,Point b) {
        return Point(a.x - b.x,a.y - b.y);
    }
    
    double Cross(Point a,Point b) {
        return a.x * b.y - a.y * b.x;
    }
    
    double Dot(Point a,Point b) {
        return a.x * b.x + a.y * b.y;
    }
    
    
    bool SegmentCross(Point a1,Point a2,Point b1,Point b2) {
        double c1 = Cross(a2 - a1,b1 - a1),
               c2 = Cross(a2 - a1,b2 - a1),
               c3 = Cross(b2 - b1,a1 - b1),
               c4 = Cross(b2 - b1,a2 - b1);
        return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
    }
    
    bool nonecross(Point a1,Point a2) {
        for(int i = 0;i < pw.size();i += 2) {
            if(SegmentCross(a1,a2,pw[i],pw[i + 1]))
                return false;
        }
        return true;
    }
    
    
    void solve() {
        //构建邻接矩阵
        M = p.size();
        for(int i = 0;i < M;i++) {
            for(int j = i + 1;j < M;j++) {
                if(nonecross(p[i],p[j])) {
                    dist[i][j] = dist[j][i] = 
                        sqrt(Dot(p[i]-p[j],p[i]-p[j]));
                } else dist[i][j] = INF;
            }
        }
        //bellman-ford
        for(int i = 0;i < M;i++) d[i] = INF;
        d[0] = 0;
        for(int i = 0;i < M;i++) {
            for(int j = 0;j < M;j++) {
                for(int k = 0;k < M;k++) if(dist[j][k] < INF) {
                    if(d[j] < INF) {
                        d[k] = min(d[k],d[j] + dist[j][k]);
                    }
                }
            }
        }
        printf("%.2f
    ",d[M - 1]);
    }
    
    int main() {
        while(cin >> N,N != -1) {
            p.clear();
            pw.clear();
            p.push_back(Point(0,5));
            for(int i = 1;i <= N;i++) {
                double posx,posy;
                cin >> posx;
                pw.push_back(Point(posx,0));
                for(int j = 0;j < 4;j++) {
                    cin  >> posy;
                    p.push_back(Point(posx,posy));
                    pw.push_back(Point(posx,posy));
                }
                pw.push_back(Point(posx,10));
            }
            p.push_back(Point(10,5));
            solve();
        }
        return 0;
    }
    

      

  • 相关阅读:
    C++--第25课
    C++--第24课
    C++--第23课
    C++--第22课
    C++--第21课
    C++--第20课
    C++--第19课
    C++--第18课
    C++--第17课
    Windows程序设计学习笔记(1):一个简单的windows程序
  • 原文地址:https://www.cnblogs.com/rolight/p/3849494.html
Copyright © 2011-2022 走看看