最邻近点策略
#include<iostream>
using namespace std;
const int INF=10e5;
const int MAX_N=20;
int arc[MAX_N][MAX_N]= {{INF,3,3,2,6},
{3,INF,7,3,2},
{3,7,INF,2,5},
{2,3,2,INF,3},
{6,2,5,3,INF}
};
int flag[MAX_N];
int n=5;
int TSP(int x) {
int tsp=0,i,j,k,u,v;
u=x;
flag[u]=1;
for(i=0; i<n-1; i++) {
int min=INF;
for(j=0; j<n; j++) {
if(flag[j]==0&&arc[u][j]<min) {
min=arc[u][j];
v=j;
}
}
tsp+=min;
flag[v]=1;
cout<<u+1<<"-->"<<v+1<<endl;
u=v;
}
tsp+=arc[v][x];
cout<<v+1<<"-->"<<x+1<<endl;
return tsp;
}
int main() {
cout<<"最短路程为:"<<TSP(0)<<endl;
return 0;
}
最短链接策略
#include<iostream>
#include<utility>
#include<test.cpp>
using namespace std;
const int INF=10e5;
const int MAX_N=20;
int arc[MAX_N][MAX_N]= {
{INF,3,3,2,6},
{3,INF,7,3,2},
{3,7,INF,2,5},
{2,3,2,INF,3},
{6,2,5,3,INF}
};
int flag[MAX_N];
int arcFlag[MAX_N][MAX_N];
int n=5;
pair<int,int> Search() {
int min=INF,a=0,b=0;
for(int i=0; i<n; i++) {
for(int j=0; j<i; j++) {
if(!arcFlag[i][j]&&flag[i]<2&&flag[j]<2&&arc[i][j]<min) {
a=i;
b=j;
min=arc[i][j];
}
}
}
flag[a]++;
flag[b]++;
arcFlag[a][b]=1;
return pair<int,int>(a,b);
}
int TSP() {
int tsp=0,i,j,k;
for(k=0; k<n; k++) {
pair<int,int> a=Search();
tsp+=arc[a.first][a.second];
}
return tsp;
}
int main() {
cout<<"最短路程为:"<<TSP()<<endl;
return 0;
}