参考:https://www.cnblogs.com/zhuohan123/p/3237246.html

因为一c可以由1-a-b得出,所以删掉c,把a,b抽象成二维平面上的点。首先考虑一个客户需求能被哪些原料配出来:两个原料点连线上的点都可以,要是多个原料点,那么这些线的向量构成的凸包中的点都可以

所以得到了一个n三方算法:枚举每两个原料点,看是否所有需求点都在这条向量的半平面里,是则连1,然后Floyd求最小环即可

但是有非常多恶心的特判……

1.需求点重合为一点

2.需求点出现在两种原料点所在直线上的情况

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=505,inf=1e9;
const double eps=1e-10;
int m,n,a[N][N];
double c;
struct dian
{
double x,y;
dian(double X=0,double Y=0)
{
x=X,y=Y;
}
dian operator - (const dian &a) const
{
return dian(x-a.x,y-a.y);
}
}q[510],p[510];
dian V(dian a,dian b)
{
return dian(b.x-a.x,b.y-a.y);
}
double cj(dian a,dian b)
{
return a.x*b.y-b.x*a.y;
}
bool ok(dian s,dian t,dian p)
{
return !((s.x>p.x&&t.x>p.x)||(s.x<p.x&&t.x<p.x)||(s.y>p.y&&t.y>p.y)||(s.y<p.y&&t.y<p.y));
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&c);
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf",&q[i].x,&q[i].y,&c);
for(int i=1;i<=m;i++)
{
bool flag=1;
for(int j=1;j<=n;j++)
if(abs(p[i].x-q[j].x)>eps||abs(p[i].y-q[j].y)>eps)
flag=0;
if(flag)
{
printf("1\n");
return 0;
}
}
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
a[i][j]=inf;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
if(i!=j)
{
if(abs(p[i].x-p[j].x)<eps&&abs(p[i].y-p[j].y)<eps)
continue ;
int can=1;
for(int k=1;k<=n;k++)
if(cj(p[j]-p[i],q[k]-p[i])<-eps)
can=0;
if(can)
{
for(int k=1;k<=n;k++)
{
double cp=cj(p[j]-p[i],q[k]-p[i]);
if(cp<eps&&cp>-eps&&(!ok(p[i],p[j],q[k])))
can=0;
}
}
if(can)
a[i][j]=1;
}
int ans=inf;
for(int k=1;k<=m;k++)
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
{
if(i!=j&&a[i][j]+a[j][i]<ans)
ans=a[i][j]+a[j][i];
if(i==j&&a[i][j]<ans)
ans=a[i][j];
}
printf("%d\n",ans==inf?-1:ans);
return 0;
}

最新文章

  1. iOS事件传递-&gt;处理-&gt;响应
  2. Python列表去除重复元素
  3. Kibana源码剖析 —— savedSearch从读取到跳转
  4. 77 找出最大连续自然数个数[Longest Consecutive Sequence in an Unsorted Array]
  5. [读书笔记] java类初始化
  6. poj3461 字符串匹配 熟悉kmp算法第一题
  7. PHP函数中默认参数的的写法
  8. union关键字 与大小端模式
  9. C#中Thread.Join()的理解
  10. obj-c编程12:复制对象
  11. 如何在linux环境安装JDK
  12. Java架构师技能发展脑图
  13. 【原创】C++之自定义高效的swap(1)
  14. vuejs2.0使用Sortable.js实现的拖拽功能
  15. 在500jsp错误页面获取错误信息
  16. 螺旋队列和hiho1525逃离迷宫3
  17. thrift系列 - 快速入门
  18. 7. Debug on local machine
  19. android基础篇------------java基础(11)(文件解析xml and Json )
  20. IOS-每个程序员的编程之路上都应该看这11本书

热门文章

  1. 转 常见hash算法的原理
  2. java 定时备份数据库
  3. Oracle 行转列小结
  4. ArcGIS Server 9.3集群部署(多som+多soc)
  5. CentOS 6.x DRBD
  6. libevent API 介绍
  7. soapUI系列之—-03 Groovy脚本常用方法2
  8. Linux bash介绍与使用
  9. OpenvSwitch代码分析之bridge和port
  10. web 开发之js---页面缓存, jsp 缓存, html 缓存, ajax缓存,解决方法