hdu4971:http://acm.hdu.edu.cn/showproblem.php?pid=4971

题意:给你n个项目,每完成一个项目会有一定的收益,但是为了完成某个项目,要先学会一些技能,学习每个技能会有一定的花费。并且,在学习某项技能之前,可能需要需要先学习前一种技能,最后问你最后能够获得的最大的收益。

题解:这一题,很容易想到网络流,关键是建图,首先把每个技能拆点,两个点之间的容量就是每个技能的花费。人然后右边的边和会点建立一边,容量无穷大,然后就是每个项目的到技能左边的点连接一条边,容量无穷大,然后是源点和每个项目之间建立一条边,容量就是收益。最后就是技能之间的,如果学习i技能之前要学习j技能,那么i的左端点到j的左端点之间连一边,容量无穷大。然后跑网络流,最终的答案就是总收益减去总流量。

  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cstdio>
  5 #include<queue>
  6 #define INF 100000000
  7 using namespace std;
  8 const int N=205;
  9 const int M=1000000;
 10 struct Node{
 11    int v;
 12    int f;
 13    int next;
 14 }edge[M];
 15 int n,m,u,v,cnt,sx,ex;
 16 int head[N],pre[N],visit[N];
 17 int val1[N],val2[N];
 18 void init(){
 19     cnt=0;
 20     //memset(edge,0,sizeof(edge));
 21     memset(head,-1,sizeof(head));
 22 }
 23 void add(int u,int v,int w){
 24     edge[cnt].v=v;
 25     edge[cnt].f=w;
 26     edge[cnt].next=head[u];
 27     head[u]=cnt++;
 28     edge[cnt].f=0;
 29     edge[cnt].v=u;
 30     edge[cnt].next=head[v];
 31     head[v]=cnt++;
 32 }
 33 bool BFS(){
 34   memset(pre,0,sizeof(pre));
 35   pre[sx]=1;
 36   queue<int>Q;
 37   Q.push(sx);
 38  while(!Q.empty()){
 39      int d=Q.front();
 40      Q.pop();
 41      for(int i=head[d];i!=-1;i=edge[i].next    ){
 42         if(edge[i].f&&!pre[edge[i].v]){
 43             pre[edge[i].v]=pre[d]+1;
 44             Q.push(edge[i].v);
 45         }
 46      }
 47   }
 48  return pre[ex]>0;
 49 }
 50 int dinic(int flow,int ps){
 51     int f=flow;
 52      if(ps==ex)return f;
 53      for(int i=head[ps];i!=-1;i=edge[i].next){
 54         if(edge[i].f&&pre[edge[i].v]==pre[ps]+1){
 55             int a=edge[i].f;
 56             int t=dinic(min(a,flow),edge[i].v);
 57               edge[i].f-=t;
 58               edge[i^1].f+=t;
 59             flow-=t;
 60              if(flow<=0)break;
 61         }
 62
 63      }
 64       if(f-flow<=0)pre[ps]=-1;
 65       return f-flow;
 66 }
 67 int solve(){
 68     int sum=0;
 69     while(BFS())
 70         sum+=dinic(INF,sx);
 71     return sum;
 72 }
 73 int main() {
 74     int T,k,temp,sum,tt=1;
 75     scanf("%d",&T);
 76     while(T--) {
 77          scanf("%d%d",&n,&m);
 78          sum=0;
 79          init();
 80         for(int i=1; i<=n; i++) {
 81             scanf("%d",&val1[i]);
 82             sum+=val1[i];
 83         }
 84        for(int j=1;j<=m;j++)
 85           scanf("%d",&val2[j]);
 86        for(int i=1;i<=n;i++){
 87           scanf("%d",&k);
 88           for(int j=1;j<=k;j++){
 89             scanf("%d",&temp);
 90             add(2*m+i,temp+1,INF);
 91           }
 92           add(0,2*m+i,val1[i]);
 93        }
 94        for(int i=1;i<=m;i++){
 95           for(int j=1;j<=m;j++){
 96               scanf("%d",&temp);
 97               if(temp==1){
 98                 add(i,j,INF);
 99               }
100           }
101        }
102        for(int i=1;i<=m;i++){
103           add(i,i+m,val2[i]);
104           add(i+m,2*m+n+1,INF);
105        }
106        sx=0;ex=2*m+n+1;
107        printf("Case #%d: %d\n",tt++,sum-solve());
108     }
109     return 0;
110 }

View Code

转载于:https://www.cnblogs.com/chujian123/p/3938012.html

A simple brute force problem.相关推荐

  1. Unit 2: Password Cracking 2.1 Password Cracking Brute Force Attacks

    >> In a future unit, we'll learn how attackers can get possession of a database containing has ...

  2. Brute force and exhaustive search

    Brute force and exhaustive search(蛮力和彻底搜索) Brute force is a straightforward approach to solving a pr ...

  3. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  4. Brute Force算法介绍及C++实现

    字符串的模式匹配操作可以通过Brute Force算法来实现.字符串匹配操作即是查看S串(目标串或主串)中是否含有T串(模式串或子串),如果在主串中查找到了子串,则模式匹配成功,返回模式串中的第一个字 ...

  5. 吴昊品游戏核心算法 Round 7 —— 熄灯游戏AI(有人性的Brute Force)(POJ 2811)

    暴力分为两种,一种属于毫无人性的暴力,一种属于有人性 的暴力.前面一种就不说了,对于后面一种情况,我们可以只对其中的部分问题进行枚举,而通过这些子问题而推导到整个的问题中.我称之为有人性的Brute ...

  6. DVWA学习(三)Brute Force(暴力破解)

    BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相 ...

  7. JavaScript实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码)

    JavaScript实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码) bfMaximumSubarray.js完整源代码 bfMaximumSuba ...

  8. DVWA Brute Force(low)

    0x00 设置安全水平 小白刚接触DVWA,先从简单的开始 00x1 Brute Force(蛮力:爆破) 0x02 开启firefox代理 首选项 0x03 使用brupsuite爆破 输入: ad ...

  9. DVWA 之暴力破解攻击(Brute Force)

    暴力破解(Brute Force)的意思是攻击者借助计算机的高速计算不停枚举所有可能的用户名和密码,直到尝试出正确的组合,成功登录系统.理论上,只要字典足够大,破解总是会成功的.阻止暴力破解的最有效方 ...

  10. Hydra – Brute Force HTTP(S)

    In this tutorial, I will be demonstrating how to brute force authentication on HTTP and HTTPS servic ...

最新文章

  1. scala break continue
  2. 放肆地使用UIBezierPath和CAShapeLayer画各种图形
  3. 预见2019:《2019年中国视频监控产业全景图谱》(附产业布局、政策环境、市场规模、发展趋势)
  4. Lazy Evaluation(延迟执行)
  5. 怎么创建python django项目_python怎么创建django
  6. CVPR 2020|超越H.265,中科大使用多帧数据改进视频压缩新方法
  7. ubuntu server执行sudo出现no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory...
  8. Java程序优化的一些最佳实践
  9. python语言的主网址-Python简介
  10. 基于channel的goroutine
  11. 使用Spring Session实现Spring Boot水平扩展
  12. 如何把java源码打成jar_将java源码打成jar包
  13. Python实现网络出口带宽自动巡检
  14. 北京的哪些地方开的发票可参与国家税务局的摇奖
  15. 基于arduino的ESP32 学习笔记(一) 基于ESP32的智能花盆
  16. iOS-使用CoreLocation定位
  17. 面试官:现在还有不会音视频的Android开发?
  18. Linux内核原理之通用块设备层
  19. adb命令查看手机设备
  20. 数据库查询结果去重常用方法整理

热门文章

  1. jQuery遮罩插件 jquery.blockUI.js
  2. Ubuntu编译安装Keepalived
  3. 转:CommandArgument 传多个值到另外页面的方法
  4. 面向对象的基本设计原则
  5. df 查看显示所有磁盘的信息
  6. openpyxl安装_Openpyxl玩转Excel(一)——新建、读取、复制
  7. mysql 存储过程 锁表_MYSQL锁表问题的解决方法
  8. 没有安装python如何运行py_在没有安装Python的前提下,让Sublime text编辑器来运行Py?...
  9. 操作系统实验·动态分区分配算法
  10. ngrok下载并运行实现内网穿透