poj 2531 Network Saboteur 解题报告
题目链接:http://poj.org/problem?id=2531
题目意思:将 n 个点分成两个部分A和B(也就是两个子集啦), 使得子集和最大(一定很难理解吧,呵呵)。举个例子吧,对于样例,最佳的分法就是把点2分为一个子集,另一个子集理所当然就是1、3了。 2-1 的权值是50,2-3的权值是40,那么最大就是50+40 = 90了。
首先dfs的话,我不太会做啦。看了队长的用了状态压缩来做,一下子觉得好神奇!!!!
可能第一次接触,理解得不是太深刻,先留着吧。就觉得好神奇,好神奇....好神奇... 不过总觉得它情况判断的时候有重复,看一下 第一次 的子集1: 1 子集2: 2、3 和 第六次 的子集1: 2 3 子集2: 1 实质就是一个情况嘛~~~注意:如果一个子集包含n个元素,那意味着另一个子集得0个元素,明显这个是不符合条件的。因为要求得一个子集的所有点对于另一个子集中的所有点(前提是有边相连)的和是最大的!
(不好意思啊,老是逼迫大家看我的恶心涂鸦,不过动手之后真的理解了一些咯,这个是我凭着我的涂鸦来默写滴)
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int maxn = + ;
- int c[maxn][maxn];
- int A[maxn], B[maxn]; // A[]: 用于保存子集1包含的顶点编号;B[]: 用于保存子集2包含的顶点编号
- // (注意下标0是表示顶点编号为1的点)
- int main()
- {
- int n;
- while (scanf("%d", &n) != EOF)
- {
- for (int i = ; i < n; i++)
- {
- for (int j = ; j < n; j++)
- scanf("%d", &c[i][j]);
- }
- int cnt1, cnt2;
- int ans = -;
- for (int i = ; i < (<<n); i++) // 枚举子集数, n个元素有(2^n - 1)个子集(空集除外)
- { // (3个元素有七个子集(001~111)
- cnt1 = cnt2 = ;
- for (int j = ; j < n; j++)
- {
- if (i & ( << j)) // 例如用5(2^0 + 2^2)表示第 1 个点(0)和第3个点(2)被选在第一个子集里
- A[cnt1++] = j;
- else
- B[cnt2++] = j;
- }
- int cursum = ;
- for (int k = ; k < cnt1; k++)
- {
- for (int j = ; j < cnt2; j++)
- cursum += c[A[k]][B[j]];
- }
- ans = max(cursum, ans);
- }
- printf("%d\n", ans);
- }
- return ;
- }
poj 2531 Network Saboteur 解题报告的更多相关文章
- poj 2531 Network Saboteur( dfs )
题目:http://poj.org/problem?id=2531 题意:一个矩阵,分成两个集合,求最大的 阻碍量 改的 一位大神的代码,比较简洁 #include<stdio.h> #i ...
- POJ 2531 Network Saboteur
http://poj.org/problem?id=2531 题意 :有N台电脑,每两台电脑之间都有个通信量C[i][j]; 问如何将其分成两个子网,能使得子网之间的通信量最大. 也就是说将所有节点分 ...
- POJ 2531 Network Saboteur 位运算子集枚举
题目: http://poj.org/problem?id=2531 这个题虽然是个最大割问题,但是分到dfs里了,因为节点数较少.. 我试着位运算枚举了一下,开始超时了,剪了下枝,1079MS过了. ...
- POJ 2531 Network Saboteur (枚举+剪枝)
题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大. 目前我所知道的有四种做法: 方法一:状态压缩 #include <iostream> #inc ...
- poj 2531 Network Saboteur(经典dfs)
题目大意:有n个点,把这些点分别放到两个集合里,在两个集合的每个点之间都会有权值,求可能形成的最大权值. 思路:1.把这两个集合标记为0和1,先默认所有点都在集合0里. 2 ...
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...
- 【原创】poj ----- 2376 Cleaning Shifts 解题报告
题目地址: http://poj.org/problem?id=2376 题目内容: Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K ...
- 【原创】poj ----- 1611 The Suspects 解题报告
题目地址: http://poj.org/problem?id=1611 题目内容: The Suspects Time Limit: 1000MS Memory Limit: 20000K To ...
随机推荐
- SQL 随机取出一条数据
今天遇到一需求,需要随机取出一条数据.网上找了下,sqlserver自带的有newID()这个函数,可以随机出来一个guid,用来取随机数还是蛮不错的. 直接上SQL: select top 1 *, ...
- 手动实现jQuery的toggle()效果
有时候我们希望实现toggle()切换效果,但是切换的同时需要完成一些其他要做的事情.所以我们需要对jQuery的toggle()函数进行改造. 下面好test2()函数就是一个实现toggle效果的 ...
- linux 安裝jdk
參考博客:http://www.cnblogs.com/wuqianling/p/5381895.html http://www.cnblogs.com/CuteNet/p/3947193.html ...
- 将文件从已Root Android手机中copy出来的几个cmd窗口命令
将文件从已Root Android手机中copy出来的几个cmd窗口命令: 以shell身份登录adbadb shell进入adb后切换至root用户su更改文件的所属chown shell *更改文 ...
- Linux下Shell脚本运行程序不输出日志到终端
使用: 脚本路径/脚本名 >/dev/>& 说明: 可以简单的理解/dev/null是Linux下的回收站 >默认是把标准输出重定向 2>&1是把出错输出也定向 ...
- Linux下使用Shell命令控制任务Jobs执行(转)
一.下列命令可以用来操纵进程任务: ps列出系统中正在运行的进程. kill发送信号给一个或多个进程(经常用来杀死一个进程). jobs列出当前shell环境中已启动的任务状态,若未指定jobsid, ...
- java文本文件加密解密类
原文:http://www.open-open.com/code/view/1420031154765 import java.awt.*; import java.awt.event.*; impo ...
- Mysql学习记录点
order by 数字,表示按照第几列来排序,可以从1开始,不能是0,也不能超过列数.
- C/C++中static关键字作用总结 && 指针与引用的比较
static作用: 常规答案: 1. 全局变量的隐藏:2. 函数体内记忆功能:3.类所有实例共享,static函数不接受this指针,只能访问static成员变量. 拓展:1.全局变量的隐藏,因为在其 ...
- Android源代码解析之(三)-->异步任务AsyncTask
转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了android中的异步消息机制. 主要解说了Handler对象的使用方式.消息的发送流程等.android的异步消息机制是android中多任务处 ...