7、實驗六電路佈線問題
實驗內容
內容:在一塊電路板的上、下兩端分別有n個接線柱。根據電路設計,要求用導線(i,a(i))將上端接線柱與下端接線柱相連,其中a(i)表示上端點i對應的下端點的值,如圖所示。
題目要求是在給定的連線中,選取不相交連線的最大子集,即不相交連線的最大數目。並把最大不相交子集的情況給列舉處理
解題思路
在製作電路板時,要求將這n條連線分佈到若干絕緣層上。在同一層上的連線不相交。電路佈線問題要確定將哪些連線安排在第一層上,使得該層上有儘可能多的連線。換句話說,該問題要求確定導線集Nets = {i,π(i),1 ≤ i ≤ n}的最大不相交子集。
源代碼
package f電路佈線問題;
import java.util.Scanner;
public class CircuitWiring {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("輸入一共有幾個接線柱:");
int i = scanner.nextInt();
// 定義數組jxz
int[] jxz = new int[i + 1];
System.out.println("依次輸入這" + i + "個接線柱的下端接線柱號:");
String all = scanner.next();
// 對字符串進行操作
String[] str = all.split(",");
// 給數組c賦值
jxz[0] = 0;// 給數組c的第一個賦值爲0
int q = 0;// 定義str數組的循環開始
for (int a = 1; a < i; a++) {
jxz[a] = Integer.parseInt(str[q]);
q++;
}
jxz[i] = Integer.parseInt(str[i - 1]);// 給數組c的最後一位賦值
// 顯示數組c
// for(int b=0;b<c.length;b++) {
// System.out.print(c[b]+" ");
// }
CircuitWiring cW = new CircuitWiring(jxz);
cW.getER(cW.jxz, cW.ER);
int x = cW.shortPath(cW.jxz, cW.ER, cW.route);
System.out.println("最大不相交連的線數目爲:" + x);
}
public int[] jxz;// 接線柱數組
public int[][] ER;// 最大不相交子集
public int[] route;// 最短路徑
/**
* 構造方法,進行初始化
*
* @param jxz 接線柱數組
*/
public CircuitWiring(int[] jxz) {
this.jxz = jxz;
this.ER = new int[jxz.length][jxz.length];// 下標從1開始
this.route = new int[jxz.length];
}
/**
* @see 輸出最大不相交子集的二維數組
* @param jxz 接線柱數組
* @param ER 輸入原始的二維數組
*/
public void getER(int[] jxz, int[][] ER) {
int n = jxz.length - 1;
for (int j = 0; j < jxz[1]; j++) {// i=1時,分了兩種情況,分別等於0,1
ER[1][j] = 0;
}
for (int j = jxz[1]; j <= n; j++) {
ER[1][j] = 1;
}
for (int i = 2; i <= n; i++) {// i大於1時,同樣分了兩種情況(當i=n時單獨計算,即此方法最後一行)
for (int j = 0; j < jxz[i]; j++) {// 第一種
ER[i][j] = ER[i - 1][j];
}
for (int j = jxz[i]; j <= n; j++) {// 第二種
ER[i][j] = Math.max(ER[i - 1][j], ER[i - 1][jxz[i] - 1] + 1);
}
}
ER[n][n] = Math.max(ER[n - 1][n], ER[n - 1][jxz[n] - 1] + 1);
System.out.println();
// 輸出電路佈線問題的矩陣
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= n; j++) {
System.out.print(ER[i][j] + " ");
}
System.out.println();
}
System.out.println();
}
/**
* @see 構造最優解
* @param jxz 接線柱數組
* @param ER 不相交連線的最大數目【二維數組】
* @param route 最短路徑
* @return 最大不相交連的線數目
*/
public int shortPath(int[] jxz, int[][] ER, int[] route) {
int n = jxz.length - 1;
int j = n;
int m = 0;
for (int i = n; i > 1; i--) {
if (ER[i][j] != ER[i - 1][j]) {
route[m++] = i;
j = jxz[i] - 1;
}
}
if (j >= jxz[1])
route[m++] = 1;
System.out.println("最大不相交連線爲:");
int num = 0;
for (int t = m - 1; t >= 0; t--) {
System.out.print("【" + route[t] + "," + jxz[route[t]] + "】");
num++;
if (num <= m - 1) {
System.out.print(",");
}
}
System.out.println();
return m;
}
}