题意就是把节点分成A、B两组,节点间距C给了,要求解分组的方法,使得∑Cij (i∈A,j∈B)最大。

首先把所有节点都放在一组,然后采用深度优先搜索的方法,对每一个节点都做判断是否应该移到另一组去,判断的依据是移过去和不移过去哪个得到的和值比较大(这里移去B组后的计算方法就是加上该点和在A组中的所有点的间距,和减去原本就在B组中的所有点的间距),如果移过去变小了,那么则不移过去,并剪掉该条支路。

DFS的本质就是枚举,一种递归的枚举。比如如果这个程序里面不剪枝的话就可以枚举到所有的分组情况。剪枝是优化的方法,对满足一定条件的做出判断,认为枚举下去已经没有意义,所以剪掉其分支。

#include <iostream>
using namespace std; const int MAX_N = ;
int n;
int map[MAX_N + ][MAX_N + ];
bool in_group[MAX_N + ];
int ans; void dfs(int id, int cur_sum)
{
in_group[id] = true;
int tmp_sum = cur_sum;
for (int i = ; i <= n; i++){
if (in_group[i]){
tmp_sum -= map[id][i];
}
else{
tmp_sum += map[id][i];
}
}
if (tmp_sum > ans){
ans = tmp_sum;
}
if (tmp_sum > cur_sum){
for (int i = id + ; i <= n; i++){
dfs(i, tmp_sum);
}
}
in_group[id] = false;
} int main()
{
cin >> n;
memset(in_group, , sizeof(in_group));
ans = ;
for (int i = ; i <= n; i++){
for (int j = ; j <= n; j++){
cin >> map[i][j];
}
}
dfs(, );
cout << ans << endl;
return ;
}

最新文章

  1. Java当中的反射
  2. 为什么那么多人想开发一元夺宝类app?
  3. 默认选中ComboBox的某一项
  4. MIFARE系列1《MIFARE简介》
  5. Simofox 2.7 - 基于 pcxFirefox 定制(停更)
  6. epoll使用详解(精髓)
  7. python课程day_2--&gt;总结--&gt;字符串功能
  8. 使用Mkdocs构建你的项目文档
  9. 品阿里 Java 开发手册有感
  10. ftp 传输数据:命令链路连接方法是一样的,而数据链路的建立方法就完全不同
  11. Sql 嵌套循环
  12. JavaWeb开发之详解Servlet及Servlet容器
  13. 基于CMS的组件复用实践
  14. CentOS 7 systemd的坑
  15. BAT-删除文件夹
  16. SELECT控件add方法 ie 类型不匹配
  17. 为什么java中只允许继承一个类?
  18. doxygen的简单使用(快速上手)
  19. Ajax高级应用---Comet
  20. 【IDEA】本地新建Maven项目+配置Git和GitHub+代码上传和拉取到GitHub+其他IDEA和GitHub实战

热门文章

  1. Python学习笔记(四十)— 内置模块(9)HTMLParser
  2. autofac 在.net core 与经典asp.net中的差异
  3. 【BZOJ】2440: [中山市选2011]完全平方数
  4. 数据库-SQLite
  5. Hibernate总结之常用API
  6. react input 设置默认值
  7. 深入理解Spring系列之十一:SpringMVC-@RequestBody接收json数据报415
  8. 【日期控件】JQueryUI的datepicker日期控件
  9. 73.Vivado使用误区与进阶——在Vivado中实现ECO功能
  10. dm368 ipnc3.0环境搭建脚本