POJ 3565 Ants

来源:互联网 发布:30岁的程序员何去何从 编辑:程序博客网 时间:2024/04/29 02:13

这道题有两种方法,一种是用图论中的KM算法求,因为二分图的最小权匹配一定满足两两线段不相交

另一种方法就是用计算几何中的调整思想,不断修改直到满足条件为止

#include<stdio.h>#include<algorithm>#include<math.h>using namespace std;const double eps=1e-8;int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1;}struct Point {    double x,y;    Point(){}Point(double _x,double _y){x = _x;y = _y;}    Point operator -(const Point &b)const{return Point(x - b.x,y - b.y);}    double operator ^(const Point &b)const{return x*b.y - y*b.x;}};struct Line{    Point s,e;    Line(){}    Line(Point ss,Point ee){s=ss;e=ee;};};Point ant[105],tree[105];int match[105];bool inter(Line l1,Line l2){returnmax(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= 0 &&sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= 0;}int main() {    #ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);    #endif // ONLINE_JUDGE    int n;    while(scanf("%d",&n)!=EOF){        for(int i=0;i<n;i++) scanf("%lf%lf",&ant[i].x,&ant[i].y);        for(int i=0;i<n;i++) scanf("%lf%lf",&tree[i].x,&tree[i].y);        for(int i=0;i<n;i++) match[i]=i;        while(1){            int ok=1;            for(int i=0;i<n;i++){                for(int j=0;j<n;j++){                    if (i==j) continue;                    if (inter(Line(ant[i],tree[match[i]]),Line(ant[j],tree[match[j]]))) {                        swap(match[i],match[j]);                        ok=0;                    }                }            }            if (ok) break;        }        for(int i=0;i<n;i++) printf("%d\n",match[i]+1);    }}


0 0
原创粉丝点击