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;
}
}