-
问题描述
题目 在电路板的上、下两端分别有n个接线柱。根据电路设计,用导线(i,π(i))将上端接线柱与下端接线柱相连,要求找到导线的最大不相交子集 示例 输入: 下端接线柱取值 [8,7,4,2,5,1,9,3,10,6] 输出: 最大不相交连线分别为: 3 4 5 5 7 9 9 10 最大不相交连线数目为:4
-
要求
(1) 写出问题的分析过程
问题描述
在电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱与下端接线柱相连,其中π(i)是{1,2,…,n}的一个排列。导线(i,π(i))称为该电路板上的第i条连线。
电路布线问题要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。即该问题要求确定导线集Nets={(i,π(i)),1≤i≤n}的最大不相交子集。
电路布线问题的最优值为Size(n,n)。
(2) 写出程序代码
public class DianLuBuXian {
//计算最优值算法
/*用数组net[0:n-1]存储MNS(n,n)中的m条连线。
时间复杂度O(n)。*/
public static void mns(int []c,int[][]size) {
int n=c.length-1;
for(int j=0;j<c[1];j++)
size[1][j]=0;
for(int j=c[1];j<=n;j++) {
size[1][j]=1;
}
for(int i=2;i<n;i++) {
for(int j=0;j<c[i];j++) {
size[i][j]=size[i-1][j];
}
for(int j=c[i];j<=n;j++) {
size[i][j]=Math.max(size[i-1][j], size[i-1][c[i]-1]+1);
}
size[n][n]=Math.max(size[n-1][n], size[n-1][c[n]-1]+1);
}
}
//构造最优解
public static int traceback(int []c,int [][]size,int []net) {
int n=c.length-1;
int j=n;
int m=0;
for(int i=n;i>1;i--) {
if(size[i][j]!=size[i-1][j]) {
net[m++]=i;
j=c[i]-1;
}}
if(j>=c[1])
{
net[m++]=1;
}
return m;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int p[]= {8,7,4,2,5,1,9,3,10,6};
int size[][]=new int [11][11];
int net[]=new int[11];
mns(p,size);
int 剧=traceback(p,size,net);
System.out.println("最大不相交连线数目为:"+size[9][9]);
System.out.println("连线方式为:");
for(int i=k-1;i>=0;i—) {
System.out.println(net[i]+" "+p[net[i]]);
}
}
}
(3) 贴出程序结果