布线问题
2015-12-05 10:20
295 查看
#include <iostream> #include <fstream> #include <queue> #include <cmath> using namespace std; const int INF = 100000; int conn[21][21]; //连线矩阵 int n; //元件个数 int bestx[21]; //解向量 class Node { public: int dep; //当前层 int val; //布线费用 int *x; //解向量 Node(int d, int val) { x = new int[n+1]; dep = d; } int getVal() //计算当前布线费用 { int cur = 0; for(int i=1; i<dep; i++) //计算布线成本 { for(int j=i+1; j<=dep; j++) cur += ( conn[i][j] * abs(x[j]-x[i]) ); } return cur; } //布线费用小的先出队列 bool operator < (const Node &node) const { return val >= node.val; } }; int search() { priority_queue<Node> q; Node enode(0, 0); for(int j=1; j<=n; j++) enode.x[j] = j; int best = INF; while(true) { if(enode.dep == n) { if(enode.val < best) { best = enode.val; copy(enode.x, enode.x+n+1, bestx); break; } } else { for(int i=enode.dep+1; i<=n; i++) { Node now(enode.dep+1, 0); copy(enode.x, enode.x+n+1, now.x); now.x[now.dep] = enode.x[i]; now.x[i] = enode.x[now.dep]; now.val = now.getVal(); if(now.val < best) q.push(now); } } if(q.empty()) break; else { enode = q.top(); q.pop(); } } return best; } 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; } cout << "最小布线费用为:" << search() << endl; cout << "布线方案为:\n"; for(i=1; i<=n; i++) cout << bestx[i] << " "; cout << endl; cout << endl; fin.close(); return 0; }
相关文章推荐
- CCBPM关于工作流引擎授权功能说明
- [LeetCode] Largest Rectangle in Histogram 解题思路
- AngularJs Cookies 操作
- 命名空间比较好的博客
- 圆排列问题
- js精度丢失解决办法
- maven项目配置Project Facets时further configuration available不出来问题
- js精度丢失解决办法
- 安装Hadoop系列 — 安装Hadoop
- 第14周项目1-(3)验证二叉排序树相关算法
- n皇后问题
- 迄今为止最浮夸的代码编辑器插件
- 端口简介
- sql语句中trim
- ubuntu下安装bochs遇到的问题
- 静态图—类图、包图、对象图(2)
- Android自定义Toast取代系统的Toast
- 44.封装类实现异步加载图片
- 运动员最佳匹配问题
- SaltStack实践(二)-- 安装配置Keepalived