亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? brandy3.cpp

?? 本程序用分支界限方法解決TSP問題
?? CPP
字號:
//分支限界法求解TSP問題的程序
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;

//定義相關結構體
typedef struct node_data      //結點數據結構
{
	float c[20][20];          /*費用矩陣*/
	int row_init[20];         /*費用矩陣的當前行映射為原始行*/
	int col_init[20];         /*費用矩陣的當前列映射為原始列*/
	int row_cur[20];          /*費用矩陣的原始行映射為當前行*/
	int col_cur[20];          /*費用矩陣的原始列映射為當前列*/
	int ad[20];               /*回路頂點鄰接表*/
	int k;                    /*當前費用矩陣的階*/
	float w;                  /*結點的下界*/
}NODE;

typedef struct                /*堆結構數據*/
{
	NODE *p;                  /*指向結點元素的指針*/
	float w;                  /*所指向結點的下界,堆元素的關鍵字*/ 
}HEAP;

//主要函數申明部分
float row_min(NODE *node,int row,float &second);
float col_min(NODE *node,int col,float &second);
float array_red(NODE *node);
float edge_sel (NODE *node,int &vk,int &vl);
void del_rowcol(NODE *node,int vk,int vl);
void edge_byp(NODE *node,int vk, int vl);
NODE *initial(float c[20][20],int n);
void insert(HEAP *&heap,int &n_heap,HEAP z);
HEAP delete_min(HEAP *&heap,int &n_heap);

//主函數開始
int main()
{
    int n=20;
	int ad[20],path[20];
	float c[20][20];
	float max_distance, min_distance;
	string filename="distance.txt";
	ifstream sensor;

	sensor.open(filename.c_str());             //打開文件讀取距離數據信息
	if(sensor.fail())
	{
		cout<<"Error opening input file\n";
	}
	else 
	{
		sensor>>max_distance>>min_distance;    //沒有到達文件末尾時循環讀取數據

		while(!sensor.eof())
		{
			for(int i=0;i<20;i++)
			{
				for(int j=0;j<20;j++)
				{
					sensor>>c[i][j];
				}
				c[i][i]=max_distance+1;
			}
		}
	}                                         //讀取距離信息結束

	int i,j,vk,vl;
    float d,w=0;
	NODE *xnode;
	NODE *ynode;
	NODE *znode;
	int n_heap=0;
    HEAP *heap=new HEAP[50*30];
    HEAP  x,y,z;

    xnode=initial(c,n);
    xnode->w=array_red(xnode);
    while(xnode->k!=0)
	{
		d=edge_sel(xnode,vk,vl);
        znode=new NODE;
        *znode =*xnode;
        znode->c[vk][vl]=max_distance+1;
        array_red(znode);
        znode->w=xnode->w+d;
        z.w=znode->w;
        z.p=znode;
        insert(heap,n_heap,z);  
        ynode=new NODE;
        *ynode=*xnode;
        edge_byp(ynode,vk,vl);
        del_rowcol(ynode,vk,vl);
        ynode->w=array_red(ynode);
        ynode->w+=xnode->w;
        y.w=ynode->w;
        y.p=ynode;

        if(ynode->k==2)
		{
			if(ynode->c[0][0]==0)
			{
				ynode->ad[ynode->row_init[0]]=ynode->col_init[1];
                ynode->ad[ynode->row_init[1]]=ynode->col_init[0];
			}
            else
			{
			    ynode->ad[ynode->row_init[0]]=ynode->col_init[0];
                ynode->ad[ynode->row_init[1]]=ynode->col_init[1];
			}
            ynode->k=0;
		}
        insert (heap,n_heap,y);
        delete xnode;
        x=delete_min(heap,n_heap);  
        xnode=x.p;
	}
    
    w=xnode->w;

    for(i=0;i<n;i++)               //保存鄰接表
		ad[i]=xnode->ad[i];
	
    delete xnode;

	for (i=0;i<n_heap;i++)         //釋放結點數據空間
	{
		delete heap->p;
		heap--;
	}
	heap++;

    delete []heap;                //釋放堆空間

	int t=0,k=1;                  //將鄰接表轉化為遍歷城市的順序列表,保存在path[]中
	path[0]=0;
	while(k<n)
	{
		j=t;
		t=ad[j];
		path[k]=t;
		k++;
	}                            

	cout<<"the result of the path:"<<endl;        //輸出最優遍歷城市順序的結果,轉化為A、B的形式

	for(j=0;j<20;j++)
	{
		cout<<char(path[j]+65)<<' ';
	}

	cout<<endl<<"the total length is: "<<w<<endl; //輸出最短路程的值


	return 0;
}                   //主函數結束

/**********************************函數定義部分***********************************/

//返回由指針node所指向節點費用矩陣中第row行最小值,并把次小值回送與引用變量second中
float row_min(NODE *node,int row,float &second)
{
	float temp;
    int i;
    if (node->c[row][0],node->c[row][1])
	{
		temp =node->c[row][0];   second=node->c[row][1];
    }
    else 
	{
		temp=node->c[row][1]; second=node->c[row][0];
    }
    for (i=2;i<node->k;i++)
	{
		if(node->c[row][i]<temp)
		{
			second=temp;temp=node->c[row][i];
		}
        else if(node->c[row][i]<second)
			second=node->c[row][i];
	}
    return temp;
}
//返回由指針node所指向節點費用矩陣中第col列最小值,并把次小值回送與引用變量second中
float col_min(NODE *node,int col, float &second)
{
	float temp;
    int i;
    if (node->c[0][col],node->c[1][col])
	{
		temp =node->c[0][col]; second=node->c[1][col];
    }
    else
	{
		temp=node->c[1][col]; second=node->c[0][col];
    }
    for (i=2;i<node->k;i++)
	{
		if (node->c[i][col]<temp )
		{
			second =temp; temp =node->c[i][col];
		}
        else if (node->c[i][col]<second)
			second=node->c[i][col];
     }
  return temp;
}
//歸約指針node指向的節點的費用矩陣 返回值為歸約常數
float array_red(NODE *node)
{
  int i,j;
  float temp,temp1,sum=0;
  for(i=0;i<node->k;i++)
  {
	  temp=row_min(node,i,temp1);
      for (j=0;j<node->k;j++)
		  node->c[i][j] -=temp;
      sum +=temp;
  }
  for(j=0;j<node->k;j++)
  {
	  temp=col_min(node,j,temp1);
      for (i=0;i<node->k;i++)
		  node->c[i][j] -=temp;
      sum +=temp;
  }
  return sum;
}
//計算dkl 并且搜索分支的邊 返回dkl的值
float edge_sel(NODE *node,int &vk,int &vl)
{
  int i,j;
  float temp,d=0;
  float *row_value=new float[node->k];
  float *col_value=new float[node->k];
  for (i=0;i<node->k;i++)
      row_min(node,i,row_value[i]);
  for (i=0;i<node->k;i++)
	  col_min(node,i,col_value[i]);

  for (i=0;i<node->k;i++)
  {
	  for(j=0;j<node->k;j++)
	  {
		  if (node->c[i][j]==0)
		  {
			  temp=row_value[i]+col_value[j];
		      if(temp>d)
			  {
				  d=temp; vk=i;vl=j;
			  }
		  }
	  }
  }
  delete row_value;
  delete col_value;
  return d;
}
//del_rowcol(NODE *node,int vk,int vl)刪除費用矩陣當前vk行 第vl列的所有元素
void del_rowcol(NODE *node,int vk,int vl)
{
	int i,j,vk1,vl1;
    for (i=vk;i<node->k-1;i++)
		for (j=0;j<vl;j++)
			node->c[i][j]=node->c[i+1][j];
	for (j=vl;j<node->k-1;j++)
		for (i=0;i<vk;i++)
			node->c[i][j]=node->c[i][j+1];
    for (i=vk;i<node->k-1;i++)
		for (j=vl;j<node->k-1;j++)
			node->c[i][j]=node->c[i+1][j+1];
    vk1=node->row_init[vk];
    node->row_cur[vk1]=-1;
    for (i=vk1+1;i<20;i++)
		node->row_cur[i]--;//
    vl1=node->col_init[vl];
    node->col_cur[vl1]=-1;
	for (i=vl1+1;i<20;i++)
		node->col_cur[i]--;
    for (i=vk;i<node->k-1;i++)
		node->row_init[i]=node->row_init[i+1];
    for(i=vl;i<node->k-1;i++)
		node->col_init[i]=node->col_init[i+1];
    node->k--;
}
//把vk vl表示的邊登記到頂點鄰接表 并旁路矩陣中有關的邊
void edge_byp(NODE *node,int vk, int vl)
{
	int i,j,k,l;
    vk=node->row_init[vk];
    vl=node->col_init[vl];
    node->ad[vk]=vl;
    for (i=0;i<20;i++)
	{
		j=i;
        while (node->ad[j]!=-1)
        j=node->ad[j];
        if(i!=j)
		{
			l=node->row_cur[j];
            k=node->col_cur[i];
            if((k>0)&&(l>0))
            node->c[l][k]=100;   //以后要改進的地方 100是個特殊值
		}
	}
}
//初始化函數
NODE *initial(float c[20][20],int n)
{
	int i,j;
    NODE *node=new NODE;
    for (i=0;i<n;i++)
		for (j=0;j<n;j++)
			node->c[i][j]=c[i][j];
    for (i=0;i<n;i++)
	{
		node->row_init[i]=i;
        node->col_init[i]=i;
        node->row_cur[i]=i;
        node->col_cur[i]=i;
    }
    for (i=0;i<n;i++)
		node->ad[i]=-1;
    node->k=n;
    return node;
}
//向最小堆棧插入結點函數
void insert(HEAP *&heap,int &n_heap,HEAP z)
{
	HEAP *temp;
	int k=n_heap;
	if(k==0) 
	{
		*heap=z;
	}
	else
	{
		temp=heap;
	    while(heap->w<z.w&&k>0)
		{
			*(heap+1)=*heap;
		    k--;
		    if(k>0)  heap--;
		}
	    if(k>0)  heap++;
	    *heap=z;
        heap=temp+1;
	}
    n_heap++;
}

//刪除堆棧頭結點函數
HEAP delete_min(HEAP *&heap,int &n_heap)
{
	HEAP temp;
	temp=(*heap);
	heap--;
	n_heap--;
	return temp;
}
	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩免费电影| 亚洲免费看黄网站| 综合久久一区二区三区| 视频在线观看91| jlzzjlzz国产精品久久| 91精品国产一区二区三区香蕉| 久久久五月婷婷| 日韩不卡一区二区| 一本久久综合亚洲鲁鲁五月天| 久久久久久久久久久电影| 亚洲电影欧美电影有声小说| 国产成人亚洲综合a∨婷婷| 51精品视频一区二区三区| 亚洲日本在线看| 成人手机电影网| 国产亚洲精久久久久久| 男人的j进女人的j一区| 欧美在线你懂得| 亚洲色图欧美偷拍| 99精品视频一区二区三区| 久久免费电影网| 久草这里只有精品视频| 欧美一区二区三区免费在线看| 亚洲制服丝袜av| 91成人在线免费观看| 亚洲天堂网中文字| 91丨porny丨国产入口| 国产精品国产三级国产| 成人av网站在线观看免费| 亚洲国产成人一区二区三区| 国产成人综合网站| 国产精品国产三级国产普通话三级| 高清国产一区二区| 中文字幕一区二区视频| 91麻豆自制传媒国产之光| 亚洲精品免费看| 欧美色综合天天久久综合精品| 一区二区三区免费观看| 色视频成人在线观看免| 亚洲18女电影在线观看| 91精品国产aⅴ一区二区| 蜜桃一区二区三区四区| 久久综合av免费| 国产xxx精品视频大全| 最新中文字幕一区二区三区 | 国产农村妇女毛片精品久久麻豆 | 亚洲欧洲色图综合| 91丨porny丨国产入口| 亚洲一区在线电影| 91麻豆精品国产91久久久久| 蜜臀精品一区二区三区在线观看 | 亚洲国产成人精品视频| 欧美电影影音先锋| 国产经典欧美精品| 亚洲人成小说网站色在线 | 亚洲五月六月丁香激情| 欧美精品在线一区二区| 国产精品99久久久久久似苏梦涵| 亚洲国产精品国自产拍av| 色先锋久久av资源部| 偷拍日韩校园综合在线| 日韩精品一区二区三区蜜臀| 粉嫩久久99精品久久久久久夜| 亚洲精品视频在线| 日韩欧美高清在线| 北条麻妃国产九九精品视频| 亚洲综合色自拍一区| 欧美一级精品大片| 成人国产一区二区三区精品| 亚洲午夜电影在线观看| 国产调教视频一区| 欧美色图免费看| 国产999精品久久久久久绿帽| 洋洋av久久久久久久一区| 精品国产一区a| 91福利国产成人精品照片| 国内精品国产成人国产三级粉色 | 欧美主播一区二区三区美女| 国内精品国产三级国产a久久| 一区二区三区影院| 日韩精品中午字幕| 欧美日韩成人在线一区| caoporn国产一区二区| 麻豆中文一区二区| 亚洲午夜精品一区二区三区他趣| 国产亚洲一区二区在线观看| 欧美巨大另类极品videosbest | 成人国产在线观看| 久久精品国产成人一区二区三区| 亚洲欧美日韩一区二区| 亚洲国产精品传媒在线观看| 精品成人在线观看| 日韩三级免费观看| 欧美日韩三级一区| 欧美亚洲一区二区在线观看| 国产成人鲁色资源国产91色综| 免费看日韩精品| 午夜精品久久久久久| 中文字幕一区二区三区在线观看| 久久网站最新地址| 精品国精品自拍自在线| 在线播放视频一区| 欧美视频日韩视频在线观看| 91免费看`日韩一区二区| 国产白丝网站精品污在线入口| 激情图片小说一区| 麻豆高清免费国产一区| 日本中文在线一区| 日本伊人色综合网| 日本亚洲欧美天堂免费| 丝袜美腿亚洲色图| 天天av天天翘天天综合网色鬼国产| 亚洲免费毛片网站| 亚洲另类中文字| 亚洲视频一二区| 中文字幕色av一区二区三区| 国产精品美女视频| 国产精品福利一区| 亚洲四区在线观看| 亚洲精品v日韩精品| 一区二区三区不卡视频在线观看| 亚洲欧洲日本在线| 一区二区三区日韩欧美| 一区二区在线观看视频| 亚洲综合精品久久| 日韩中文字幕av电影| 麻豆视频一区二区| 国产乱国产乱300精品| 国产成人精品免费网站| 99久久精品99国产精品| 91电影在线观看| 欧美高清激情brazzers| 日韩一区二区视频在线观看| 精品国产一区二区三区久久影院 | 欧美日本精品一区二区三区| 欧美三片在线视频观看| 日韩欧美国产电影| 国产欧美日韩中文久久| 亚洲欧美电影一区二区| 日韩电影在线一区二区三区| 韩国一区二区视频| 99久久精品一区二区| 欧美日韩不卡一区| 久久久久久99精品| 中文字幕一区二区视频| 日韩高清欧美激情| 欧美专区亚洲专区| 欧美大片一区二区| 亚洲欧洲精品天堂一级| 日韩国产精品91| 懂色av噜噜一区二区三区av| 欧美羞羞免费网站| 久久九九久久九九| 亚洲国产日韩一区二区| 国产乱色国产精品免费视频| 91国在线观看| 国产日韩欧美精品电影三级在线| 亚洲一区二区在线免费观看视频 | 丝袜亚洲精品中文字幕一区| 国产一区二区三区四| 在线观看欧美精品| 中文字幕乱码亚洲精品一区| 午夜精品123| 91亚洲国产成人精品一区二区三| 欧美成人一区二区三区在线观看| 成人欧美一区二区三区在线播放| 麻豆精品在线播放| 欧美色综合久久| 中文字幕一区二区三区在线播放| 蜜桃av一区二区| 欧美三级三级三级| 亚洲欧美在线aaa| 国产成人午夜精品5599| 日韩一区二区精品葵司在线| 亚洲精品视频自拍| www.性欧美| 久久久精品影视| 久久av老司机精品网站导航| 欧美午夜一区二区三区| 日韩一区在线播放| 不卡视频一二三| 国产亚洲精品资源在线26u| 美女一区二区三区在线观看| 欧美日韩国产一区| 一区二区久久久久久| 91免费版在线| 亚洲三级理论片| 成人a级免费电影| 中文字幕av在线一区二区三区| 韩国三级在线一区| 久久视频一区二区| 国产呦精品一区二区三区网站| 91精品国产91综合久久蜜臀| 亚洲国产精品一区二区www在线| 91丝袜美腿高跟国产极品老师| 国产精品少妇自拍| 成人久久久精品乱码一区二区三区| 国产日本亚洲高清| 成人黄色国产精品网站大全在线免费观看 | 在线视频你懂得一区二区三区|