問題
給定平面上的m個頂點以及矩陣D,D[i][j]爲第i個點到第j個點的距離;距離是對稱的,且滿足三角不等式(這樣才能保證算法的近似比爲2)。
算法步驟
1.任給k<m(只看某一行)
2.選擇使得Dkl最大的l(只看某一行)
3.輸出Dkl與k,l
算法代碼
Java
import java.util.Random;
public class PlanarGraphDiameter {
public static void main(String[] args) {
//初始化一個對稱矩陣,因爲距離是對稱的
int[][] D = new int[][]{
{1,2,3},
{2,3,4},
{3,4,5}
};
Random random = new Random();
int l = 0, max = Integer.MIN_VALUE;
int k = random.nextInt(D.length);//隨機取一行
for (int j = 0; j < D[k].length; j++) {//求這行最大
if (D[k][j] > max) {
max = D[k][j];
l = j;
}
}
System.out.println(k+"\t"+l+"\t"+max);
}
}
Scala
import scala.util.Random
object PlanarGraphDiameter2 {
def main(args: Array[String]): Unit = {
val m = 3;
val D = Array.ofDim[Int](m, m)
for(i <- 0 until m; j <- 0 until m) D(i)(j) = j+1 + i
D.foreach(row=>println(row.mkString("\t")))
val k = Random.nextInt(m)
val l = D(k).indexOf(D(k).max)
//val l = D(k).zipWithIndex.maxBy(_._1)._2//求最大值所在的索引,純粹的函數式手法
println("k:"+k,"l:"+l,"D(k)(l):"+D(k)(l))
}
}
Python
import random
m = 3
D = [[i+j+1 for j in range(m)] for i in range(m)]
print(D)
k = random.randint(0, m)
l = D[k].index(max(D[k]))
print("k:%d"%k, "l:%d"%l, "D(k)(l):%d"%D[k][l])