标题: 近似算法求解旅行售货员问题
时 限: 1000 ms
内存限制: 10000 K
总时限: 3000 ms
描述:有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少。假定所有输入的根节点或者源为第一个城市或第一组数据。
输入: n(城市数,1<=n<=100);
e(边数);
以下e行,每行3个数i,j,wij,表示在城市i,j之间修建高速公路的造价。
输出: n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。
输入样例: 5
8
1 2 2
1 3 12
1 4 1
2 3 8
2 5 9
3 4 6
3 5 3
4 5 7
输出样例:30
import java.util.Scanner;
public class Main{
static int start[],next[];
public Main(int n ,float [][]c){
float []lowcost = new
float[n+1];
int []clostest = new
int[n+1];
boolean []s = new
boolean[n+1];
start = new int[n+1];
next = new int[n+1];
s[1] = true;
for (int i=
2;i<=n;i++){
lowcost[i] =
c[1][i];
clostest[i] =
1;
s[i] =
false;
}
for (int i =
1;i<n;i++){
float min =
Float.MAX_VALUE;
int j =
1;
for (int k =
2;k<=n;k++){
if
((lowcost[k]<min)&&(!s[k])){
min
= lowcost[k];
j
= k;
}
}
// System.out.println(clostest[j]+",
"+j);
start[i] =
clostest[j];
next[i] =
j;
s[j] =
true;
for (int k =
2 ;k<=n;k++){
if
(c[j][k]<lowcost[k]&&(!s[k])){
lowcost[k]
= c[j][k];
clostest[k]
= j;
}
}
}
}
public static void PreTraverse(int n ,float
[][]c){
for (int i =
1;i<n;i++){
for (int j =
i+1;j<n;j++){
if
(start[j]==
next[i]&&start[j+1]==next[i]){
start[j+1]
= next[j];
break;
}
}
}
int sum=0;
int i;
for
(i=1;i<n;i++)
sum = (int) (sum + c[start[i]][next[i]]);
sum+=c[1][next[i-1]];
System.out.println(sum);
}
public static void main(String[] args) {
int n , e;
Scanner Scanin = new
Scanner(System.in);
n = Scanin.nextInt();
e = Scanin.nextInt();
float [][]g = new
float[n+1][n+1];
for (int i =
0;i<n+1;i++){
for (int j =
0;j < n+1;j++){
g[i][j]
= Float.MAX_VALUE;
}
}
for (int i =
0;i<e;i++){
int x =
Scanin.nextInt();
int y =
Scanin.nextInt();
float v =
Scanin.nextFloat();
g[x][y] =
v;
g[y][x] =
v;
}
new Main(n, g);
PreTraverse(n, g);
}
}