图问题的贪心法1

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;
 } 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值