最優三角形剖分
阿新 • • 發佈:2019-02-07
//此演算法和演算法導論上的矩陣鏈乘法的演算法一樣,稍微有點修改 #include<iostream> #include<fstream> #include<cmath> #include<cstdlib> using namespace std; ifstream fin("C:\\data18.in"); char ID[100]; int xpos[100]; int ypos[100]; int n; float weight[100][100]; int seperatePos[100][100]; float length[100][100]; void Init() { char name; int x,y; n=0; while(fin>>name>>x>>y) { ID[n]=name; xpos[n]=x; ypos[n++]=y; } memset(weight,0,sizeof(weight)); memset(length,0,sizeof(length)); } float circumference(int i,int k,int j) { if(i==k||i==j||k==j) return 0; float& x1=length[i][k]; float& x2=length[i][j]; float& x3=length[k][j]; if(x1==0) x1=sqrt((xpos[i]-xpos[k])*(xpos[i]-xpos[k])+(ypos[i]-ypos[k])*(ypos[i]-ypos[k])); if(x2==0) x2=sqrt((xpos[i]-xpos[j])*(xpos[i]-xpos[j])+(ypos[i]-ypos[j])*(ypos[i]-ypos[j])); if(x3==0) x3=sqrt((xpos[k]-xpos[j])*(xpos[k]-xpos[j])+(ypos[i]-ypos[j])*(ypos[i]-ypos[j])); return x1+x2+x3; } void TRIANGULATION(int i,int j) { for(int i=0;i<n;++i) weight[i][i]=0; for(int l=2;l<=n;++l) { for(int i=0;i<n-l+1;++i) { int j=i+l-1; float p; for(int k=i+1;k<j;++k) { p=weight[i][k]+weight[k][j]+circumference(i,k,j); if(p>weight[i][j]) { weight[i][j]=p; seperatePos[i][j]=k; } } } } } //輸出的格式稍微有點問題 void print(int i,int j) { int pos=seperatePos[i][j]; if(pos>i) { cout<<ID[i]<<"---"<<ID[pos]<<endl; print(i,pos); cout<<ID[pos]<<"---"<<ID[j]<<endl; print(pos,j); } } int main() { Init(); TRIANGULATION(0,n-1); cout<<ID[0]<<"---"<<ID[n-1]<<endl; print(0,n-1); system("pause"); return 0; }