【JSOI2007]合金

問題の意味

羅区P4049

考え

それは明らかなように、第1の2つの要素は、第三の、すなわち濃度を知ることができない第で、我々は最初の2つの濃度であろう\((B)\ ) 点として座標系

それぞれ、ベクター上のすべての対応点を綴ることができる2つの仮定のそれぞれのベクトル、2つの合金を検討し、B、彼らは一緒に綴ることができます

A * X + B *のY \((X + Y = 1)\)

それは、これら2つの接続点に見ることができるように

第三の点を結ぶ直線上の接続点は、表面を形成するためにどのに基づいて、すなわち3点まで延長

なお、上記から分かるように、面内の選択されたポイントの数が、それらはすべての点は、それら二十両者を接続するように形成されたポリゴンを綴られている可能性がある場合

それらは多角形がすべてのターゲットポイントを含めることができる形成するように、所定の平面上にいくつかの点で問題を単純化する極小点を見つけるために、すなわち、検索点の最小数を凸包に

列挙ラインが(ユニティに、とにかく、または右)は​​、すべての残っている標的であるように形成することができるならば任意の2点I、J、側面に存在接続することができ、右側は1であり、建フロイドは、その上に良い地図た後、再度実行します

目標点で特別な注意文は、上記の言ったように綴るために、直線上の状況のI、Jに2点のみが形成されたラインあなたがライン上にいなかったので、もし、ポイントを、しかし、セグメントが、まだ十分ではありません

コード

#include<bits/stdc++.h>
#define N 505
using namespace std;
const double eps = 1e-8;
int n,m,dis[N][N];
struct Node
{
    double a,b,c;
    Node(double aa=0.0,double bb=0.0,double cc=0.0) {a=aa;b=bb;c=cc;}
    Node operator - (const Node p)const
    {
        return Node(a-p.a,b-p.b,c-p.c);
    }
};
Node ma[N],rq[N];

double xmul(Node a,Node b) {return a.a*b.b-a.b*b.a;}
double pmul(Node a,Node b) {return a.a*b.a+a.b*b.b;}

int main()
{
    memset(dis,0x3f,sizeof(dis));
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;++i) scanf("%lf%lf%lf",&ma[i].a,&ma[i].b,&ma[i].c);
    for(int i=1;i<=n;++i) scanf("%lf%lf%lf",&rq[i].a,&rq[i].b,&rq[i].c);
    
    for(int i=1;i<=m;++i)
    for(int j=1;j<=m;++j)
    {
        bool flag=1;
        for(int k=1;k<=n;++k)
        {
            double xm=xmul(ma[i]-rq[k],ma[j]-rq[k]);
            double pm=pmul(ma[i]-rq[k],ma[j]-rq[k]);
            if(xm>eps) {flag=0;break;}
            else if(fabs(xm)<eps&&pm>eps) {flag=0;break;}
        }
        if(flag) dis[i][j]=1;
    }
    
    for(int k=1;k<=m;++k)
        for(int i=1;i<=m;++i)
            for(int j=1;j<=m;++j)
            dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    int ans=1e9;
    for(int i=1;i<=m;++i) ans=min(ans,dis[i][i]);
    if(ans==1e9) cout<<-1<<endl;
    else cout<<ans<<endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/Chtholly/p/11544489.html