一.问题
TSP 问题( traveling salesman problem )是指旅行家要旅行 n 个城市,要求经历各个城市且仅经历一次然后回到出发城市,并要求所走的路程最短。
二. TSP 问题的贪心策略可以采用最近邻点策略
从任意城市出发,每次在没有到过的城市中选择最近的一个,直至经过了所有城市,最后回到出发城市。
三.代码实现
package wwww.leetcode;
//TSP问题
public class tsp {
public static void main(String[] args) {
System.out.println("边的代价为:");
int arc[][] = {{1000, 3, 3, 2, 6},
{3, 1000, 7, 3, 2},
{3, 7, 1000, 2, 5},
{2, 3, 2, 1000, 3},
{6, 2, 5, 3, 1000}};
for (int i = 0; i < arc.length; i++) {
for (int j = 0; j <arc[i].length ; j++) {
System.out.print(arc[i][j]+"\t");
}
System.out.print("\n");
}
int b = TSP(arc, 5, 0);
System.out.println("路程最短为:"+b);
}
public static int TSP(int arc[][], int n, int w) {
int edgeCount = 0, TSPLength = 0;
int min, u, v = 0;
int flag[] = new int[n];
u = w;
flag[w] = 1;
while (edgeCount < n-1 ) {
min = 100;
for (int j = 0; j < n; j++)
if ((flag[j] == 0) && (arc[u][j] != 0)&& (arc[u][j] < min)) {
v = j;
min = arc[u][j];
}
TSPLength += min;
flag[v] = 1;
edgeCount++;
System.out.print(u + "-->" + v+" " );
u = v;
}
System.out.print(u + "-->" + w);
System.out.println("\n");
return TSPLength + arc[u][w];
}
}
四.TSP的时间复杂度:o(n^2)