#include<iostream>
#include<math.h>
using namespace std;
//输入多边形的顶点(二维)序列,构造最优的三角剖分,所谓最优三角剖分是指n个顶点的凸多边形,从任何顶点向它不相邻的顶点连线
//可以构成n-2个三角形,n个顶点可以构成n(n-2)个三角形
//三角形的边上的权值是边上两个邻接点的欧式距离,找出这n(n-2)个三角形权值最小的那n-2组
const double Max=1000000;
double distance(double **p,int i,int j) //计算顶点i,j的欧式距离
{
return pow(p[i][0]-p[j][0],2)+pow(p[i][1]-p[j][1],2);
}
void OptimalTrangleDivision(double **p,int n,int& besti) //找出最优三角剖分
{
double sum; //不相邻顶点欧式距离之和
double min=Max;
int i,j;
int cnt;// 用于计数,n个顶点可以有n-3条对角线
for(i=0;i<n;i++)
{
sum=0;
for(cnt=0,j=(i+2)%n;cnt<n-3;j=(j+1)%n,cnt++)
{
sum+=distance(p,i,j);
if(sum<min)
{
min=sum;
besti=i;
}
}
}
}
void main()
{
int n;
cout<<"输入多边形的顶点数N:";
cin>>n;
double **p=new double*[2]; //多边形的顶点数组
int i;
for(i=0;i<n;i++) p[i]=new double[2];
for(i=0;i<n;i++) //顶点数组初始化
{
cout<<"输入第"<<i<<"个顶点的横坐标:";
cin>>p[i][0];
cout<<"输入第"<<i<<"个顶点的纵坐标:";
cin>>p[i][1];
}
int besti;
OptimalTrangleDivision(p,n,besti);
int j,cnt;
cout<<"最优三角剖分是:"<<endl;
for(cnt=0,j=(besti+2)%n;cnt<n-3;cnt++,j=(j+1)%n)
{
cout<<"从顶点"<<besti<<"到顶点"<<j<<endl;
}
}