您的位置:首页 > 其它

电路布线

2016-05-25 18:29 148 查看

电路布线



#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

typedef struct line
{
int i, j;
}L;
class MNS
{
public :
MNS()
{
cin >> n;
C.assign(n + 1, 0);
for (int i = 1; i <= n; i++)
{
int in;
cin >> in;
C[i] = in;
}
vector<int> iv(n+1 , 0);
S.push_back(iv);
for (int i = 1; i <= n; i++)
{
vector<int> iv1(n+1, 0);
S.push_back(iv1);
}

}
void FindMNS()
{
//N(1,j)
for (int i = 1; i <= n; i++)
{
if (i < C[1])
{
S[1][i] = 0;
}
else
{
S[1][i] = 1;
}
}
//N(i,j) . i > 1;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (j < C[i])
{
S[i][j] = S[i - 1][j];
}
else
{
S[i][j] = max(S[i - 1][j], S[i - 1][C[i] - 1] + 1);
}
}
}
}

void TraceBack(int i , int j)
{
if (i != 0)
{
if (j >= C[i])
{
if (S[i][j] == S[i - 1][C[i] - 1] + 1)
{
M.push_back({ i , C[i] });
TraceBack(i - 1, C[i]-1);
}
else
{
TraceBack(i - 1, j);
}
}
else
{
TraceBack(i - 1, j);
}
}
}
void Print()
{
cout << endl;
cout << "OutPut :" << endl;
for (int i = 1; i <= n; i++)
{
cout << C[i]<<" ";
}
cout << endl;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cout << S[i][j]<<" ";
}
cout << endl;
}
cout << endl;
TraceBack(n, n);
for (int i = 0; i < M.size(); i++)
{
cout << "(" << M[i].i << " , " << M[i].j << ")" << endl;
}
}
public :
vector<int> C;//接线柱的某种连接方案,一种排列
vector<vector<int> > S;//|M[i][j]|
vector<L> M;//最大不相交子集
int n;
};
MNS mns;

int main()
{
mns.FindMNS();
mns.Print();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: