题目大意:原题链接

给定n个节点,任意两个节点之间有权值,把这n个节点分成A,B两个集合,使得A集合中的每一节点与B集合中的每一节点两两结合(即有|A|*|B|种结合方式)权值之和最大。

标记:A集合:true  B集合:false

解法一:dfs+剪枝

#include<iostream>
#include<cstring>
using namespace std;
int n,ans;
bool in[];
int graph[][];
void dfs(int i,int cursum)
{
in[i]=true;
int maxsum=cursum;
for(int j=;j<=n;j++){
if(!in[j]) maxsum+=graph[i][j];
else maxsum-=graph[i][j];
}
if(maxsum>ans) ans=maxsum;
if(maxsum>cursum){//枚举+递归
for(int j=i+;j<=n;j++)
dfs(j,maxsum);
}//如果加进A组没有使得maxsum增大,则不加进去
in[i]=false;
}
int main()
{
cin>>n;
memset(in,,sizeof(in));
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
cin>>graph[i][j];
}
ans=;
dfs(,);
cout<<ans<<endl;
}

解法二:随机化算法(好神奇的思路)

#include<iostream>
#include<cstdlib>
using namespace std;
const int TLE=;//本题时间限制为2000ms
int main()
{
int n,m[][];
cin>>n;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
cin>>m[i][j];
}
/*Random Algorithm*/
bool in[]={false};
int time=*TLE;//使随机次数尽可能大,随机结果尽可能接近最优解
int maxsum=,cursum=;
while(time--){
int x=rand()%n+;//范围:1~n
in[x]=!in[x];//改变x所在的集合位置
for(int i=;i<=n;i++){
if(in[i]!=in[x]) cursum+=m[i][x];
else cursum-=m[i][x];
}
if(maxsum<cursum) maxsum=cursum;
}
cout<<maxsum<<endl;
}

PKU 2531 Network Saboteur(dfs+剪枝||随机化算法)的更多相关文章

  1. POJ2531Network Saboteur(DFS+剪枝)

    Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10391   Accepted: 4990 ...

  2. POJ 2531 Network Saboteur (枚举+剪枝)

    题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大. 目前我所知道的有四种做法: 方法一:状态压缩 #include <iostream> #inc ...

  3. poj 2531 Network Saboteur( dfs )

    题目:http://poj.org/problem?id=2531 题意:一个矩阵,分成两个集合,求最大的 阻碍量 改的 一位大神的代码,比较简洁 #include<stdio.h> #i ...

  4. poj 2531 Network Saboteur(经典dfs)

    题目大意:有n个点,把这些点分别放到两个集合里,在两个集合的每个点之间都会有权值,求可能形成的最大权值.   思路:1.把这两个集合标记为0和1,先默认所有点都在集合0里.             2 ...

  5. POJ 2531 Network Saboteur 位运算子集枚举

    题目: http://poj.org/problem?id=2531 这个题虽然是个最大割问题,但是分到dfs里了,因为节点数较少.. 我试着位运算枚举了一下,开始超时了,剪了下枝,1079MS过了. ...

  6. POJ 2531 Network Saboteur

    http://poj.org/problem?id=2531 题意 :有N台电脑,每两台电脑之间都有个通信量C[i][j]; 问如何将其分成两个子网,能使得子网之间的通信量最大. 也就是说将所有节点分 ...

  7. poj 2531 Network Saboteur 解题报告

    题目链接:http://poj.org/problem?id=2531 题目意思:将 n 个点分成两个部分A和B(也就是两个子集啦), 使得子集和最大(一定很难理解吧,呵呵).举个例子吧,对于样例,最 ...

  8. Network Saboteur(dfs)

    http://poj.org/problem?id=2531 不太理解这个代码... #include <stdio.h> #include <string.h> ][],v[ ...

  9. POJ-2561 Network Saboteur(DFS)

    题目: A university network is composed of N computers. System administrators gathered information on t ...

随机推荐

  1. Linux心得记录

    2014.4.8 linux环境下如何删除一个目录? rm -r linux本身提供删除目录命令——rmdir,但是如果你要删除的目录中含有子目录或者子文件,那么该命令会提示“删除失败:目录非空“也就 ...

  2. 【MongoDB】嵌套数组查询方案

    From:http://stackoverflow.com/questions/12629692/querying-an-array-of-arrays-in-mongodb 数据 db.multiA ...

  3. MathType中如何快速输入空心字母

    MathType输入数学公式时非常方便有效的,在文档中涉及到数学公式或者符号时都是使用MathType来进行的,因为它比Office自带的公式编辑器功能更为完善,使用起来更快捷.在数学公式中,在不同的 ...

  4. GCC命令基础

    gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点, 现在很多程序员都应用GCC,怎样才能更好的应用GCC. 目前,GCC可 ...

  5. 编程之美 set 20 构造数独

    1. 朴素 DFS 遍历效率太低, 即便是预先设定 9 个数放到数组再去 DFS, 同样并不高效 2. 在生成一个可行解后, 随机删除一些数字, 删除的数字越多, 数独的难度就越大 3. 正解二. 3 ...

  6. 【BZOJ1895】Pku3580 supermemo Splay

    [BZOJ1895]Pku3580 supermemo Description 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg ...

  7. LAMP集群项目五 nfs分发文件到服务器

    前边已经配置了免密钥登录,现在脚本直接调用scp即可 ./etc/init.d/functions ] then echo “argv is not correct” exit fi for ip i ...

  8. 领悟 JavaScript 中的面向对象

    JavaScript是基于对象的语言,我们可以使用面向对象的思想去开发js代码. JavaScript是基于对象的语言. 可以使用面向对象的思想,但是不少人对这一点理解得并不全面. 在 JavaScr ...

  9. 20165330 2017-2018-2 《Java程序设计》第3周学习总结

    课本知识总结 第四章 类与对象 类:包括类声明和类体 基本格式: class 类名 { 类体的内容 } 类声明: class+类名(注意:类名首字母需大写) 类体:类声明之后的一对"{&qu ...

  10. Open 常用开源

    msdn:https://msdn.microsoft.com/zh-cn codeplex:https://www.codeplex.com/ gotdotnet:http://www.gotdot ...