结合得好巧妙。。。。

化简后的问题是:

给你两个点集A,B,求B的一个子集BB,使得BB的凸包包含A的凸包,求BB的最小大小。

先特判答案为1,2的情况,答案为3的情况,我们先构造一个有向图:

对于B集合中的两个点u,v,如果 所有A集合的点都在u->v的左侧,那么就连一条u->v的边。

于是我们可以证明一个包含A的凸包和我们连出来的有向图中的环一一对应(不考虑点数小于等于2的情况)。

于是现在我们的问题就是求最小的一个环,用floyd搞,最后统计min(f[i][i])。

  1. /**************************************************************
  2. Problem: 1027
  3. User: idy002
  4. Language: C++
  5. Result: Accepted
  6. Time:1308 ms
  7. Memory:2008 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <cmath>
  12. #include <cstring>
  13. #include <algorithm>
  14. #define line(a,b) ((b)-(a))
  15. #define eps 1e-8
  16. #define oo 0x3f3f3f3f
  17. #define N 550
  18. using namespace std;
  19.  
  20. int sg( double x ) { return (x>-eps)-(x<eps); }
  21. struct Vector {
  22. double x, y;
  23. Vector(){}
  24. Vector( double x, double y ):x(x),y(y){}
  25. Vector operator-( const Vector &b ) const { return Vector(x-b.x,y-b.y); }
  26. double operator^( const Vector &b ) const { return x*b.y-y*b.x; }
  27. double operator&( const Vector &b ) const { return x*b.x+y*b.y; }
  28. double len() { return sqrt(x*x+y*y); }
  29. bool operator<( const Vector &b ) const {
  30. return sg(x-b.x)< || (sg(x-b.x)== && sg(y-b.y)<);
  31. }
  32. bool operator==( const Vector &b ) const {
  33. return sg(x-b.x)== && sg(y-b.y)==;
  34. }
  35. };
  36. typedef Vector Point;
  37.  
  38. int n, m;
  39. Point aa[N], bb[N];
  40. int dis[N][N];
  41.  
  42. bool onleft( const Point &a, const Point &b, const Point &c ) {
  43. return sg(line(a,b)^line(a,c))>=;
  44. }
  45. bool onseg( const Point &a, const Point &b, const Point &c ) {
  46. return sg(line(a,b)^line(a,c))== && sg(line(c,a)&line(c,b))<;
  47. }
  48. bool case1() {
  49. if( m== ) {
  50. for( int i=; i<=n; i++ )
  51. if( aa[i]==bb[] )
  52. return true;
  53. }
  54. return false;
  55. }
  56. bool case2() {
  57. bool ok = true;
  58. for( int i=; i<=m && ok; i++ )
  59. for( int j=i+; j<=m && ok; j++ )
  60. for( int k=j+; k<=m && ok; k++ )
  61. if( sg((bb[i]-bb[j])^(bb[k]-bb[j])) )
  62. ok =false;
  63. if( ok ) {
  64. int ii=, jj=;
  65. double ll = -1.0;
  66. for( int i=; i<=m; i++ )
  67. for( int j=i+; j<=m; j++ ) {
  68. double l = (bb[i]-bb[j]).len();
  69. if( l>ll ) {
  70. ii = i;
  71. jj = j;
  72. ll = l;
  73. }
  74. }
  75. for( int i=; i<=n; i++ )
  76. for( int j=i+; j<=n; j++ )
  77. if( onseg(aa[i],aa[j],bb[ii]) && onseg(aa[i],aa[j],bb[jj]) )
  78. return true;
  79. }
  80. return false;
  81. }
  82. int main() {
  83. scanf( "%d%d", &n, &m );
  84. for( int i=; i<=n; i++ ) {
  85. double x, y, z;
  86. scanf( "%lf%lf%lf", &x, &y, &z );
  87. aa[i] = Point(x,y);
  88. }
  89. for( int i=; i<=m; i++ ) {
  90. double x, y, z;
  91. scanf( "%lf%lf%lf", &x, &y, &z );
  92. bb[i] = Point(x,y);
  93. }
  94. sort( bb+, bb++m );
  95. m = unique( bb+, bb++m ) - bb - ;
  96. sort( aa+, aa++n );
  97. n = unique( aa+, aa++n ) - aa - ;
  98. if( case1() ) {
  99. printf( "1\n" );
  100. return ;
  101. } else if( case2() ) {
  102. printf( "2\n" );
  103. return ;
  104. }
  105. memset( dis, 0x3f, sizeof(dis) );
  106. for( int u=; u<=n; u++ )
  107. for( int v=; v<=n; v++ ) {
  108. if( u==v ) continue;
  109. bool ok = true;
  110. for( int k=; k<=m; k++ )
  111. if( !onleft(aa[u],aa[v],bb[k]) ) {
  112. ok = false;
  113. break;
  114. }
  115. if( ok ) {
  116. dis[u][v] = ;
  117. }
  118. }
  119. for( int k=; k<=n; k++ )
  120. for( int i=; i<=n; i++ )
  121. for( int j=; j<=n; j++ )
  122. dis[i][j] = min( dis[i][j], dis[i][k]+dis[k][j] );
  123. int ans = oo;
  124. for( int i=; i<=n; i++ ) {
  125. if( dis[i][i]== ) continue;
  126. ans = min( ans, dis[i][i] );
  127. }
  128. printf( "%d\n", ans==oo ? - : ans );
  129. }

bzoj 1027 floyd求有向图最小环的更多相关文章

  1. UVa 247 - Calling Circles(Floyd求有向图的传递闭包)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. FZU 2090 旅行社的烦恼 floyd 求无向图最小环

    题目链接:旅行社的烦恼 题意是求无向图的最小环,如果有的话,输出个数,并且输出权值. 刚刚补了一发floyd 动态规划原理,用了滑动数组的思想.所以,这个题就是floyd思想的变形.在k从1到n的过程 ...

  3. poj1734 Sightseeing trip(Floyd求无向图最小环)

    #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...

  4. hdu 1599 find the mincost route floyd求无向图最小环

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  5. 【BZOJ 1027】 (凸包+floyd求最小环)

    [题意] 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...

  6. floyd求最小环 模板

    http://www.cnblogs.com/Yz81128/archive/2012/08/15/2640940.html 求最小环 floyd求最小环 2011-08-14 9:42 1 定义: ...

  7. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  8. Floyd求最小环!(转载,非原创) 附加习题(原创。)HDU-1599

    //Floyd 的 改进写法可以解决最小环问题,时间复杂度依然是 O(n^3),储存结构也是邻接矩阵 int mincircle = infinity; Dist = Graph; ;k<nVe ...

  9. 2018.09.15 hdu1599find the mincost route(floyd求最小环)

    传送门 floyd求最小环的板子题目. 就是枚举两个相邻的点求最小环就行了. 代码: #include<bits/stdc++.h> #define inf 0x3f3f3f3f3f3f ...

随机推荐

  1. MeasureSpec介绍及使用详解

    一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求.一个MeasureSpec有大小和模式组成.他有三种模式: UNSPECIFIED ...

  2. 【算法】Base64编码

    1.说明 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. 2.编码 ASCII码 -> 十六进制码 -> ...

  3. Ubuntu server 搭建Git server【转】

    转自:http://www.cnblogs.com/candle806/p/4064610.html Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客 ...

  4. Linux USB驱动框架分析(2)【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html   看了http://blog.chinaunix.net/uid-11848011 ...

  5. Tomcat的JVM设置和连接数设置

    Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m Linux环境下修 ...

  6. Flask:初次使用Blueprints

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2,Eclipse Oxygen.1a Release (4.7.1a),PyDev 6.3.2 本文为记录自己第一次使用 ...

  7. (三)HttpClient 抓取图片

    第一节: HttpClient 抓取图片 这里pom.xml需要用到io输入输出: <dependency> <groupId>commons-io</groupId&g ...

  8. python类型学习

    python类型学习 标准类型 数字 Integer 整型 Boolean 布尔型 Long integer 长整型 Floating point real numer  浮点型 Complex nu ...

  9. HttpService与WebService的差异

    httpservice通过post和get得到你想要的东西webservice就是使用soap协议得到你想要的东西,相比httpservice能处理些更加复杂的数据类型 当你要调用一个你本服务的内容的 ...

  10. C#中ASCII码与字符串的互换

    主要代码: int a = (int)'a';// 把字符直接转换为int类型,即可得到ASCII码值 ).ToString();// 将数字直接转换为char类型,即可得到ASCII码对应的字符 C ...