Advertisement
yicongli

LG4049

Mar 17th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define db double
  6.  
  7. const int N=505;
  8. const int INF=0x3f3f3f3f;
  9.  
  10. struct Point{db x,y;};
  11. #define Vec Point
  12. inline Vec operator - (const Point &a,const Point &b){return Vec{a.x-b.x,a.y-b.y};}
  13. inline db  operator * (const Point &a,const Point &b){return a.x*b.y-b.x*a.y;}
  14. inline db  dot (const Point &a,const Point &b){return a.x*b.x+a.y*b.y;}
  15.  
  16. Point A[N];
  17. Point B[N];
  18. int dis[N][N];
  19.  
  20. int main(){
  21.     int m,n;
  22.     scanf("%d%d",&m,&n);
  23.     for(int i=1;i<=m;++i){
  24.         db a,b,c;
  25.         scanf("%lf%lf%lf",&a,&b,&c);
  26.         A[i]=Point{a*1e6,b*1e6};
  27.     }
  28.     for(int i=1;i<=n;++i){
  29.         db a,b,c;
  30.         scanf("%lf%lf%lf",&a,&b,&c);
  31.         B[i]=Point{a*1e6,b*1e6};
  32.     }
  33.     memset(dis,0x3f,sizeof(dis));
  34.     for(int i=1;i<=m;++i){
  35.         for(int j=1;j<=m;++j){
  36.             bool flag=1;
  37.             for(int k=1;k<=n;++k){
  38.                 db t=(A[j]-A[i])*(B[k]-A[i]);
  39.                 if(t<0||(t==0&&dot(B[k]-A[i],B[k]-A[j])>0)){
  40.                     flag=0;
  41.                     break;
  42.                 }
  43.             }
  44.             if(flag){
  45.                 dis[i][j]=1;
  46.             }
  47.         }
  48.     }
  49.     for(int k=1;k<=m;++k){
  50.         for(int i=1;i<=m;++i){
  51.             for(int j=1;j<=m;++j){
  52.                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
  53.             }
  54.         }
  55.     }
  56.     int ans=INF;
  57.     for(int i=1;i<=m;++i){
  58.         ans=min(ans,dis[i][i]);
  59.     }
  60.     printf("%d\n",ans==INF?-1:ans);
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement