近似算法求解旅行售货员问题

 

 

标题: 近似算法求解旅行售货员问题
时 限: 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 10
2 3 8
2 5 9
3 4 6
3 5 3
4 5 7
输出样例:

30

View Code
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     static int n = 0;
 5     static float[][] c = null;
 6     static int mincost = 0;
 7 
 8     public static void prim(int n, float[][] c) {
 9         float[] lowcost = new float[n + 1];
10         int[] closest = new int[n + 1];
11         boolean[] s = new boolean[n + 1];
12 
13         s[1] = true;
14 
15         for (int i = 2; i <= n; i++) {
16             lowcost[i] = c[1][i];
17             closest[i] = 1;
18             s[i] = false;
19         }
20 
21         int m = 1;
22         for (int i = 1; i < n; i++) {
23             float temp = Float.MAX_VALUE;
24             int j = 1;
25             for (int j2 = 2; j2 <= n; j2++) {
26                 if ((!s[j2]) && (lowcost[j2] < temp)) {
27                     temp = lowcost[j2];
28                     j = j2;
29                 }
30             }
31 
32             // System.out.println(closest[j]+ " "+j );
33             mincost = mincost + (int) c[m][j];
34             m = j;
35 
36             if (i == n - 1) {
37                 mincost = mincost + (int) c[j][1];
38             }
39             s[j] = true;
40 
41             for (int k = 2; k <= n; k++) {
42                 if ((c[j][k] < lowcost[k]) && (!s[k])) {
43                     lowcost[k] = c[j][k];
44                     closest[k] = j;
45                 }
46             }
47         }
48     }
49 
50     public static void main(String[] args) {
51         // TODO Auto-generated method stub
52         Scanner myscanner = new Scanner(System.in);
53         n = myscanner.nextInt();
54         int e = 0;
55         e = myscanner.nextInt();
56         c = new float[n + 1][n + 1];
57 
58         for (int i = 1; i <= n; i++) {
59             for (int j = 1; j <= n; j++) {
60                 c[i][j] = Float.MAX_VALUE;
61             }
62         }
63         for (int i = 0; i < e; i++) {
64             int ix = myscanner.nextInt();
65             int iy = myscanner.nextInt();
66             int wij = myscanner.nextInt();
67             //无向边
68             c[ix][iy] = wij;
69             c[iy][ix] = wij;
70         }
71 
72         Main.prim(n, c);
73 
74         System.out.println(mincost);
75     }
76 }

 

posted @ 2012-05-22 14:57  itbird  Views(906)  Comments(0Edit  收藏  举报