TSP问题
【问题】TSP问题是指旅行家要旅行n个城市,要求各个城市经历仅且一次,然后回到出发城市,并要求所走路程最短。
【想法】TSP问题的贪心策略可以采用最近邻点策略,从任意城市出发,,没有到过的城市选择最近的一个,直到经历所有城市;还有一种最短链接策略,今天主要是第一种策略。
【算法】
输入:无向带权图G=(V,E),顶点W
输出:路径
1、初始化:p{};
2、u=w;V=V-{w};
3、循环直到集合P包含n-1条边
3.1 查找与顶点u邻接的最小代价边(u, v)并且v属于集合V;
3.2 P=P+{(u, v)};
3.3 V=V-{v};
3.4 u=v; //从顶点v出发继续求解
【分析】时间性能为O(n^2)
【代码】
#include<stdio.h>
#include <iostream>
#define MaxCost 999999
#define MaxVex 300
using namespace std;
typedef struct graph{
int Vex[MaxVex];//顶点数(城市数)
int Arcs[MaxVex][MaxVex];//邻接矩阵,存储边的信息
int vexnum,arcsnum;//当前图的顶点数和边数
}MGraph;//结构体
void Creat_graph(MGraph *G)//生成无向网
{
int i,j,k;
cout<<"请输入顶点n的值:"<<endl;
cin>>G->vexnum;
cout<<"请输入图的边数:"<<endl;
cin>>G->arcsnum;
cout<<"生成顶点表,请输入各个顶点点的信息:"<<endl;
for(i=1;i<=G->vexnum;i++)
cin>>G->Vex[i];
for(i=1;i<=G->vexnum;i++) //初始化邻接表,全为正无穷大,不接通
for(j=1;j<=G->vexnum;j++)
G->Arcs[i][j]=MaxCost;
cout<<"生成邻接表,请输入各个边的信息:"<<endl;
for(k=1;k<=G->arcsnum;k++)
{
cout<<"请输入边的两个顶点"<<endl;//顶点用数据表示
cin>>i>>j;
cout<<"请输入边的权值:"<<endl;
cin>>G->Arcs[i][j];
G-> Arcs[j][i]= G->Arcs[i][j];
}
}
void TPS_1(MGraph *G)//贪心算法 (最近邻点)
{
int w;//出发顶点
int edgeCount=0,TSPLength=0;//所求时的顶点数,和回路长度
int min ,u,v;//终点和中间结点
int flag[G->vexnum]={0};//标志数组
cout<<"请输入起始点:"<<endl;
cin>>w;
u=w; flag [w]=1;
while( edgeCount<G->vexnum-1) //循环直到集合P当中包含n-1条边
{
min=MaxCost;
for (int j=1;j<=G->vexnum;j++)
{
if(flag[j]==0&&(G->Arcs[u][j]!=0)&&(G->Arcs[u][j]<min))
{
v=j;min=G->Arcs[u][j];
}
}
//TSPLength+=G->Arcs[u][v];
flag[v]=1;edgeCount++;
cout<<u<<"—>"<<v<<endl;//输出路径
u=v;//下一次从顶点出发
}
cout<<v<<"—>"<<w<<endl;//输出最后的回边
//return TSPLength+G->Arcs[u][w];
}
int main()
{
MGraph G;
Creat_graph(&G);//调用创建邻接表的信息
TPS_1(&G);
return 0;
}