Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define db double
- const int N=505;
- const int INF=0x3f3f3f3f;
- struct Point{db x,y;};
- #define Vec Point
- inline Vec operator - (const Point &a,const Point &b){return Vec{a.x-b.x,a.y-b.y};}
- inline db operator * (const Point &a,const Point &b){return a.x*b.y-b.x*a.y;}
- inline db dot (const Point &a,const Point &b){return a.x*b.x+a.y*b.y;}
- Point A[N];
- Point B[N];
- int dis[N][N];
- int main(){
- int m,n;
- scanf("%d%d",&m,&n);
- for(int i=1;i<=m;++i){
- db a,b,c;
- scanf("%lf%lf%lf",&a,&b,&c);
- A[i]=Point{a*1e6,b*1e6};
- }
- for(int i=1;i<=n;++i){
- db a,b,c;
- scanf("%lf%lf%lf",&a,&b,&c);
- B[i]=Point{a*1e6,b*1e6};
- }
- memset(dis,0x3f,sizeof(dis));
- for(int i=1;i<=m;++i){
- for(int j=1;j<=m;++j){
- bool flag=1;
- for(int k=1;k<=n;++k){
- db t=(A[j]-A[i])*(B[k]-A[i]);
- if(t<0||(t==0&&dot(B[k]-A[i],B[k]-A[j])>0)){
- 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=INF;
- for(int i=1;i<=m;++i){
- ans=min(ans,dis[i][i]);
- }
- printf("%d\n",ans==INF?-1:ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement