A simple brute force problem.
hdu4971:http://acm.hdu.edu.cn/showproblem.php?pid=4971
题意:给你n个项目,每完成一个项目会有一定的收益,但是为了完成某个项目,要先学会一些技能,学习每个技能会有一定的花费。并且,在学习某项技能之前,可能需要需要先学习前一种技能,最后问你最后能够获得的最大的收益。
题解:这一题,很容易想到网络流,关键是建图,首先把每个技能拆点,两个点之间的容量就是每个技能的花费。人然后右边的边和会点建立一边,容量无穷大,然后就是每个项目的到技能左边的点连接一条边,容量无穷大,然后是源点和每个项目之间建立一条边,容量就是收益。最后就是技能之间的,如果学习i技能之前要学习j技能,那么i的左端点到j的左端点之间连一边,容量无穷大。然后跑网络流,最终的答案就是总收益减去总流量。
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<cstdio>
- #include<queue>
- #define INF 100000000
- using namespace std;
- const int N=;
- const int M=;
- struct Node{
- int v;
- int f;
- int next;
- }edge[M];
- int n,m,u,v,cnt,sx,ex;
- int head[N],pre[N],visit[N];
- int val1[N],val2[N];
- void init(){
- cnt=;
- //memset(edge,0,sizeof(edge));
- memset(head,-,sizeof(head));
- }
- void add(int u,int v,int w){
- edge[cnt].v=v;
- edge[cnt].f=w;
- edge[cnt].next=head[u];
- head[u]=cnt++;
- edge[cnt].f=;
- edge[cnt].v=u;
- edge[cnt].next=head[v];
- head[v]=cnt++;
- }
- bool BFS(){
- memset(pre,,sizeof(pre));
- pre[sx]=;
- queue<int>Q;
- Q.push(sx);
- while(!Q.empty()){
- int d=Q.front();
- Q.pop();
- for(int i=head[d];i!=-;i=edge[i].next ){
- if(edge[i].f&&!pre[edge[i].v]){
- pre[edge[i].v]=pre[d]+;
- Q.push(edge[i].v);
- }
- }
- }
- return pre[ex]>;
- }
- int dinic(int flow,int ps){
- int f=flow;
- if(ps==ex)return f;
- for(int i=head[ps];i!=-;i=edge[i].next){
- if(edge[i].f&&pre[edge[i].v]==pre[ps]+){
- int a=edge[i].f;
- int t=dinic(min(a,flow),edge[i].v);
- edge[i].f-=t;
- edge[i^].f+=t;
- flow-=t;
- if(flow<=)break;
- }
- }
- if(f-flow<=)pre[ps]=-;
- return f-flow;
- }
- int solve(){
- int sum=;
- while(BFS())
- sum+=dinic(INF,sx);
- return sum;
- }
- int main() {
- int T,k,temp,sum,tt=;
- scanf("%d",&T);
- while(T--) {
- scanf("%d%d",&n,&m);
- sum=;
- init();
- for(int i=; i<=n; i++) {
- scanf("%d",&val1[i]);
- sum+=val1[i];
- }
- for(int j=;j<=m;j++)
- scanf("%d",&val2[j]);
- for(int i=;i<=n;i++){
- scanf("%d",&k);
- for(int j=;j<=k;j++){
- scanf("%d",&temp);
- add(*m+i,temp+,INF);
- }
- add(,*m+i,val1[i]);
- }
- for(int i=;i<=m;i++){
- for(int j=;j<=m;j++){
- scanf("%d",&temp);
- if(temp==){
- add(i,j,INF);
- }
- }
- }
- for(int i=;i<=m;i++){
- add(i,i+m,val2[i]);
- add(i+m,*m+n+,INF);
- }
- sx=;ex=*m+n+;
- printf("Case #%d: %d\n",tt++,sum-solve());
- }
- return ;
- }
A simple brute force problem.的更多相关文章
- HDU 4971 A simple brute force problem.
A simple brute force problem. Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged o ...
- HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...
- HDU 4971 - A simple brute force problem【最大权闭合图】
有n(20)个工程,完成每个工程获得收益是p[i],m(50)个需要解决的难题,解决每个难题花费是c[i] 要完成第i个工程,需要先解决ki个问题,具体哪些问题,输入会给出 每个难题之间可能有依赖关系 ...
- 【最小割】HDU 4971 A simple brute force problem.
说是最大权闭合图.... 比赛时没敢写.... 题意 一共同拥有n个任务,m个技术 完毕一个任务可盈利一些钱,学习一个技术要花费钱 完毕某个任务前须要先学习某几个技术 可是可能在学习一个任务前须要学习 ...
- hdu - 4971 - A simple brute force problem.(最大权闭合图)
题意:n(n <= 20)个项目,m(m <= 50)个技术问题,做完一个项目能够有收益profit (<= 1000),做完一个项目必须解决对应的技术问题,解决一个技术问题须要付出 ...
- BNU 4356 ——A Simple But Difficult Problem——————【快速幂、模运算】
A Simple But Difficult Problem Time Limit: 5000ms Memory Limit: 65536KB 64-bit integer IO format: %l ...
- HDU 6215 Brute Force Sorting(模拟链表 思维)
Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- hdu6215 Brute Force Sorting
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6215 题目: Brute Force Sorting Time Limit: 1000/100 ...
- hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)
这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...
随机推荐
- Qt学习之路: 国际化(上)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/244689 2D ...
- hadoop错误Cannot load libcrypto.so (libcrypto.so cannot open shared object file No such file or directory)
报如下错误 解决方法: 1.使用hadoop checknative –a命令检查,报如下错误 2.使用如下命令建立libcrypto.so文件的符号链接 如果,您认为阅读这篇博客让您有些收获,不妨点 ...
- asp.net网站性能优化2则
摘要:Web服务器的性能优化有很多资料介绍了,多台主机负载均衡,查询结果的多级缓 存,数据库索引优化等都是常见的优化手段.随着后端优化空间越来越小,现在越来越多 的网站更注重前端性能的优化,就是浏览器 ...
- centos7安装chrome的历程(fedora同)
安装 首先是下载,地址奉上:http://www.google.cn/chrome/browser/desktop/index.html,选择64 bit .rpm (适用于 Fedora/openS ...
- JDK自带方法实现RSA非对称加密
package jdbc.pro.lin; import java.security.InvalidKeyException; import java.security.Key; import jav ...
- Android 设计随便说说之简单实践(模块划分)
上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...
- jvm - 内存结构以其解析
可以将jvm粗略分为以下部分: Heap Memory:存储java对象. Non-Heap Memory:存储加载的class文件,以及其他meta-data信息. Other:存储java代码,j ...
- 编写适合windows 7 平台的软件,给程序添加UAC认证
Delphi程序必须在资源里面嵌入MANIFEST信息 一. 首先编辑一个文件,内容如下: <?xml version="1.0" encoding="UTF-8& ...
- 查看oracle 启动了多久
想看一下系统正常运行了多少天?开机多长时间没有重启了? windows系统 C:\>systeminfo |find “系统启动时间”系统启动时间: 265 天 4 小时 26 分 32 ...
- 解决IE无法解析json的方法
一.原始方法eval() 二.json插件--github开源插件:json-js/json2.js https://github.com/douglascrockford/JSON-js/blob/ ...