凸边形最优三角剖分

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值