fjnu 凸多边形三角剖分

来源:互联网 发布:电子白板软件免费下载 编辑:程序博客网 时间:2024/04/29 15:25

凸多边形的三角剖分

1. 问题描述

P是一个有n个顶点的凸多边形,P中的弦是P中连接两个非相邻顶点的线段。用P中的n-3条弦将P剖分成n-2个三角形(如下图所示)。使得n-3弦的长度之和最小的三角剖分称为最优三角剖分。

2. 具体要求

输入:输入的第一行是一个正整数m,表示测试例个数,接下来几行是m个测试例的数据,每个测试例的数据由两行组成,第一行含一个正整数n (n<=500),表示凸多边形的顶点个数;第二行含2n个实数x1 , y1 , x2 , y2 , xn , yn ,按顺时针方向依次给出n个顶点的坐标值(xi, yi) i=1, 2, , n,整数之间用一个空格隔开。

输出:对于每个测试例输出一行,含一个实数(精确到小数点后三位),表示最优三角剖分的n-3条弦的长度之和。两个测试例的输出数据之间用一个空行隔开。

3. 测试数据

输入:1
6
1 2 2 1.5 2 0.5 1 0 0 0.5 0 1.5

输出:

5.606
其动态方程为:

C[i,j]=0  (i=j||i=j+1||i+1=j);

C[i,j]=min {C[i,k-1]+C[k-1,j]}.

C[i,j]表示第i个顶点到第j个顶点三角剖分的最优值)

最后结果为C[1,n]-W[1,n].

for(d=2;d<n;d++)

           {

              for(i=1;i<=n-d;i++)

              {

                  j=i+d;

                  s=w[i][j];

                  c[i][j]=10000000;

                  min=10000000;

                  for(k=i+1;k<=j;k++)

                  {

                     t=c[i][k-1]+c[k-1][j];

                        if(t<min&&t!=0)

                         min=t;

                    

                  }

                  if(min<10000000)

                     c[i][j]=s+min;

                  else

                     c[i][j]=s;

              }

           }