50,530
社区成员
发帖
与我相关
我的任务
分享
public class Factory{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
float[][] a = new float[12][12];
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
if (i == j) {
a[i][j] = 0;
} else {
a[i][j] = Float.MAX_VALUE;
}
}
}
a[0][1] = 4;
a[1][0] = 4;
a[0][2] = 5;
a[2][0] = 5;
a[0][3] = 10;
a[3][0] = 10;
a[0][4] = 12;
a[4][0] = 12;
a[0][5] = 18;
a[5][0] = 18;
a[0][6] = 27;
a[6][0] = 27;
a[0][7] = 30;
a[7][0] = 30;
a[0][8] = 31;
a[8][0] = 31;
a[0][9] = 38;
a[9][0] = 38;
a[0][10] = 39;
a[10][0] = 39;
a[0][11] = 47;
a[11][0] = 47;
Float[] dist = new Float[12];
int[] prev = new int[12];
Map<String, Float[]> distMap = new HashMap<String, Float[]>();
List<Float[]> list = new ArrayList<Float[]>(12);
for (int i = 0; i < 12; i++) {
//System.out.print(i+"--->");
dijkstra(i, a, dist, prev);
distMap.put(i+"f", dist);
/*for(int j=0; j<12; j++)
{
System.out.print(dist[j]+" ");
}
System.out.println();*/
dist = new Float[12];
//System.out.println();
}
float min = Float.MAX_VALUE;
int p = -1, q=-1, r=-1;
Map<String, Float[]> tempMap = new HashMap<String, Float[]>();
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
for (int k = 0; k < 12; k++) {
if(i!=j&&i!=k&&j!=k)
{
tempMap.put(i+"y", distMap.get(i+"f"));
tempMap.put(j+"y", distMap.get(j+"f"));
tempMap.put(k+"y", distMap.get(k+"f"));
float tempmin = 0.0f;
for (int m = 0; m < 12; m++) {
float temp = Float.MAX_VALUE;
if (m != i && m != j && m != k) {
//取得当前的点到当前所选的
三个原料厂中那个地点最短
for (Map.Entry<String,
Float[]> entry : tempMap
.entrySet
()) {
if (temp >
entry.getValue()[m]) {
temp =
entry.getValue()[m];
}
}
//此处是求的当前所选的三个
节点,所有节点到和其最进的节点距离之和
tempmin+=temp;
}
}
tempMap.clear();
//比较整个最小
System.out.println("最小和为: "+tempmin+"
三个原料厂为:"+i+" "+j+" "+k);
if(min>tempmin)
{
min=tempmin;
p=i;
q=j;
r=k;
}
}
}
}
}
System.out.println("最小和为: "+min+"三个原料厂为:"+p+" "+q+"
"+r);
}
public static void dijkstra(int v, float[][] a, Float[] dist, int[] prev)
{
int n = dist.length - 1;
if (v < 0 || v >n)
return;
boolean[] s = new boolean[n + 1];
//此处的循环是初始化
for (int i = 0; i <= n; i++) {
dist[i] = a[v][i];
s[i] = false;
if (dist[i] == Float.MAX_VALUE)
prev[i] = -1;
else
prev[i] = v;
}
//此处开始遍历
dist[v] = 0.0f;
s[v] = true;
//该循环是求的所有节点到源节点的路径,每循环一次求的一个节点到源节
点的距离
for (int i = 0; i <=n; i++) {
float temp = Float.MAX_VALUE;
int u = v;
//shortestPath(此处取该循环为shortestPath)
for (int j = 0; j < n; j++) {
if ((!s[j]) && (dist[j] < temp)) {
u = j;
temp = dist[j];
}
}
//System.out.print(u+" dist:"+dist[u]+" ");
s[u] = true;
//updateDist(取名为updateDist)
for (int j = 0; j <=n; j++) {
if ((!s[j]) && (a[u][j] < Float.MAX_VALUE)) {
float newdist = dist[u] + a[u][j];
if (newdist < dist[j]) {
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}
}