标题: 近似算法求解旅行售货员问题
时 限: 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);
}
}