#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
int conn[21][21];
int n;
int p[21];
int bestp[21];
int min = 100000;
int cur;
void compute()
{
cur = 0;
for(int i=1; i<n; i++) //计算布线成本
{
for(int j=i+1; j<=n; j++)
cur += ( conn[i][j] * abs(p[j]-p[i]) );
}
if(cur < min) //复制最优解
{
copy(p, p+n+1, bestp);
min = cur;
}
}
void backtrack(int dep)
{
if(dep >= n)
compute();
for(int i=dep+1; i<=n; i++)
{
swap(p[dep], p[i]);
backtrack(dep+1);
swap(p[dep], p[i]);
}
}
int main()
{
ifstream fin("布线.txt");
cout << "元件数:";
fin >> n; cout << n << endl;
cout << "输入元件之间连线数:\n";
for(int i=1; i<n; i++)
{
for(int j=i+1; j<=n; j++)
{
fin >> conn[i][j];
cout << conn[i][j] << " ";
}
cout << endl;
}
for(i=1; i<=n; i++)
p[i] = i;
backtrack(1);
cout << "最小布线费用为:" << min << endl;
cout << "布线方案为:\n";
for(i=1; i<=n; i++)
cout << bestp[i] << " ";
cout << endl;
cout << endl;
fin.close();
return 0;
}
布线问题
最新推荐文章于 2023-05-05 20:41:47 发布