#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define N 7 //凸边形边数+1
int weight[][N]={
{0,2,2,3,1,4},
{2,0,1,5,2,3},
{2,1,0,2,1,4},
{3,5,2,0,6,2},
{1,2,1,6,0,1},
{4,3,4,2,1,0}
}; //凸边形权值
int getWeight(int i, int k, int j) //得到三角形权值
{
return weight[i][k] + weight[k][j] + weight[j][i];
}
int MinWeightTriangulation(int n, int t[][N], int b[][N])
//返回最优剖分后的最小权值
//n+1为凸多边形的边数
//t[i][j]记录凸多边形{vi-1,vi..vj}的最优三角剖分所对应的权函数值
//t[1][n]为凸多边形(n+1)的最优权值
//b记录划分点
{
int i, j, r, k;
for(i=1; i<=n; i++)
t[i][i] = 0; //{vi-1,vi}为退化三角形,权值为0
for(r=2; r<=n; r++) //规模分别为2、3...n
for(i=1; i<=n-r+1; i++) //规模数
{
j = i + r -1; //子问题左端点为i, 规模为r, 右端点为j
t[i][j] = t[i][i] + t[i+1][j] + getWeight(i-1,i,j); //初始最优值
b[i][j] = i;
for(k=i+1; k<j; k++) //检查每一个断点
{
int temp = t[i][k] + t[k+1][j] + getWeight(i-1,k,j);
if(temp<t[i][j])
{
t[i][j] = temp; //更新最优值
b[i][j] = k;
}
}
}
return t[1][n];
}
void traceBack(int i, int j, int b[][N]) //构造最优解
//b[i][j]记录了vi-1和vj构成三角形的第3个顶点的位置
{
if(i==j)
return;
traceBack(i,b[i][j],b);
traceBack(b[i][j]+1,j,b);
printf("v%d v%d v%d\n", i-1, b[i][j], j);
}
int main()
{
int t[N][N], b[N][N];
printf("最优三角形剖分值为:");
int min = MinWeightTriangulation(5, t, b);
printf("%d\n", min);
traceBack(1, 5, b);
return 0;
}
凸边形最优三角剖分
最新推荐文章于 2024-04-28 06:27:06 发布