电路布线

电路布线



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


猜你喜欢

转载自blog.csdn.net/u013747658/article/details/51500667
今日推荐