⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cw.cpp

📁 应用C-W节约算法
💻 CPP
字号:
#include "stdio.h" 
#include "math.h" 
void main() 
{ 
long x[21]={0},y[21]={0},d[191]={0},e[191]={0},g[41]={0},s[42]={0}; 
int i,j,h=1,l,o,m,n=0,p,q=3,r=0; 
int flag; 
double k,a[21]={0},b[21][21]={0},c[21][21]={0},f[191]={0}; 
char ch; 

printf("                            C-W算法求解TSP问题 \n\n\n"); 
    printf("请输入坐标(20个以内),坐标之间用空格隔开,按回车键结束输入:\n"); 
    
re:scanf("%d,%d",&x[h],&y[h]); 
  ch=getchar(); 
  if(ch!='\n') 
  { h++; 
    goto re; 
  }     
  
    for(i=1;i <h+1;i++) 
  a[i]=sqrt(x[i]*x[i]+y[i]*y[i]);  
  
for(i=1;i <h;i++) 
  { 
  for(j=i+1;j <h+1;j++) 
    {  n++; 
      b[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); 
      c[i][j]=a[i]+a[j]-b[i][j]; 
      d[n]=i; 
      e[n]=j; 
      f[n]=c[i][j]; 
    } 
  }  
  
for(i=1;i <n;i++) 
  { flag=0; 
    for(j=1;j <n+1-i;j++) 
        if(f[j]>f[j+1]) 
          { k=f[j];f[j]=f[j+1];f[j+1]=k; 
          l=d[j];d[j]=d[j+1];d[j+1]=l; 
            o=e[j];e[j]=e[j+1];e[j+1]=o; 
            flag=1; 
          } 
    if(flag==0) 
      break; 
  }  

printf("\n"); 
    printf("节约值排序:\n"); 
for(i=n;i>0;i--) 
  { if(f[i]!=0) 
    printf("%lf(%ld,%ld)--(%ld,%ld)\n",f[i],x[d[i]],y[d[i]],x[e[i]],y[e[i]]); 
  }  
  
g[1]=d[n]; 
g[2]=e[n]; 
    
for(m=1;m <h;m++) 
  { 
  for(j=n-1;j>0;j--) 
    {  p=0; 
    for(i=1;i <41;i++) 
      {  
        if(d[j]==g[i])  
          p=p+1; 
        if(e[j]==g[i]) 
          p=p+1; 
      } 
    if(p==1) 
      { g[q]=d[j]; 
        g[q+1]=e[j]; 
      } 
      if(p==1) 
        break; 
    } 
    q=q+2; 
  }  
    
    
    printf("\n选出连接点:\n"); 
    for(i=1;i <41;i=i+2) 
      { if(g[i]!=0) 
        { 
        printf("(%ld,%ld)--(%ld,%ld)\n",x[g[i]],y[g[i]],x[g[i+1]],y[g[i+1]]); 
          r=r+2; 
        } 
      } 
        
  s[21]=g[1]; 
  s[22]=g[2]; 
  
      for(i=3;i <r;i=i+2) 
          for(j=1;j <42;j++) 
            { 
            if(g[i]==s[j]) 
              { 
              if(s[j-1]==0) 
                s[j-1]=g[i+1]; 
              else 
                s[j+1]=g[i+1]; 
                break; 
              } 
              
            if(g[i+1]==s[j]) 
              { 
              if(s[j-1]==0) 
                s[j-1]=g[i]; 
              else 
                s[j+1]=g[i]; 
                break; 
              } 
            } 
            
        printf("\n旅行商路线:\n");  
        printf("(0,0)--");  
      for(i=1;i <42;i++)  
        { 
        if(s[i]!=0)  
          printf("(%ld,%ld)--",x[s[i]],y[s[i]]); 
        } 
        printf("(0,0)"); 
        getchar(); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -