题意:
     网选赛的一个题目,当时各种超时各种wa,哎! 题意是有n个人m道题,每个人对每道题都有一个ac率,每相邻的n到题目必须n个人每人一道,顺序无所谓,上下的m%n道只要不出现一个人做两道就行,最后要求输出最大的ac率。

思路:

     第一眼就感觉是网络流,然后建了一个很复杂的图,结果各种超时,当时吧这个题目想的复杂了,队友后来用dp过了这个题目,感觉有点失落啊,回去了第二天早上又敲了一边费用流,ac了,哎! 感觉没那么难受了,要是没看出来是网络流做不出来也就算了,看出来了,没敲出来,感觉耻辱啊,其实这个题目并不难,我们直接跑m/k+m%k次网络流就行了,具体看代码,一开始我的建图是跑一遍,然后给每个n个题目虚拟出n个人来,如果有余数在虚拟出n个人来,结果各种wa到现在也没找到原因,m/k+m%k次的细节具体看代码。




#include<stdio.h>
#include<string.h>
#include<queue>#define N_node 50
#define N_edge 500
#define INF 100000000

using namespace std;typedef struct
{int from ,to ,next ,flow;double cost;
}STAR;STAR E[N_edge];
int    list[N_node] ,tot;
int    mer[N_edge];
double s_x[N_node];
double num[15][1100];void add(int a ,int b ,double c ,int d)
{E[++tot].from = a;E[tot].to = b;E[tot].cost = c;E[tot].flow = d;E[tot].next = list[a];list[a] = tot;E[++tot].from = b;E[tot].to = a;E[tot].cost = -c;E[tot].flow = 0;E[tot].next = list[b];list[b] = tot;
}bool spfa(int s ,int t ,int n)
{int mark[N_node] = {0};for(int i = 0 ;i <= n ;i ++)s_x[i] = -INF;mark[s] = 1,s_x[s] = 0;queue<int>q;q.push(s);memset(mer ,255 ,sizeof(mer));while(!q.empty()){int xin ,tou;tou = q.front();q.pop();mark[tou] = 0;for(int k = list[tou] ;k ;k = E[k].next){xin = E[k].to;if(s_x[xin] < s_x[tou] + E[k].cost && E[k].flow){s_x[xin] = s_x[tou] + E[k].cost;mer[xin] = k;if(!mark[xin]){mark[xin] = 1;q.push(xin);}}}}return mer[t] != -1;
}double M_C_Flow(int s ,int t ,int n)
{int maxflow = 0 ,minflow;double maxcost = 0;while(spfa(s ,t ,n)){minflow = INF;for(int i = mer[t] ;i + 1 ;i = mer[E[i].from])if(minflow > E[i].flow) minflow = E[i].flow;for(int i = mer[t] ;i + 1 ;i = mer[E[i].from]){E[i].flow -= minflow;E[i^1].flow += minflow;maxcost += minflow * E[i].cost;}maxflow += minflow;}return maxcost;
}int main ()
{int n ,m ,i ,j ,t ,cas = 1;scanf("%d" ,&t);while(t--){scanf("%d %d" ,&n ,&m);for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++)scanf("%lf" ,&num[i][j]);double Ans = 0;for(i = 1 ;i <= m ;i ++){if(i % n == 0){memset(list ,0 ,sizeof(list)) ,tot = 1; for(int ii = 1 ;ii <= n ;ii ++) add(0 ,ii ,0 ,1);for(int ii = 1 ;ii <= n ;ii ++)for(int jj = 1 ;jj <= n ;jj ++)add(ii ,n + jj ,num[ii][i-n+jj] ,1);for(int ii = 1 ;ii <= n ;ii ++) add(ii + n ,n + n + 1 ,0 ,1);Ans += M_C_Flow(0 ,n + n + 1 ,n + n + 1);}  }if(m % n){memset(list ,0 ,sizeof(list)) ,tot = 1; for(int ii = 1 ;ii <= n ;ii ++) add(0 ,ii ,0 ,1);for(int ii = 1 ;ii <= n ;ii ++)for(int jj = 1 ;jj <= m % n ;jj ++)add(ii ,n + jj ,num[ii][m-(m%n)+jj] ,1);for(int ii = 1 ;ii <= n ;ii ++) add(ii + n ,n + n + 1 ,0 ,1);Ans += M_C_Flow(0 ,n + n + 1 ,n + n + 1);}printf("Case #%d: %.5lf\n" ,cas ++ ,Ans);}return 0;
}

hdu 5045 费用流相关推荐

  1. hdu 3395(费用流,二分图的最大权匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3395 解题思路: 这个构图很容易出错,最开始都容易想,把每个点拆开,分为攻击和被攻击的,建图如下: 源 ...

  2. HDU 1533 费用流入门

    费用流 (最小费用最大流) 网络图中 每条边 多给出了 单位流量的费用 cost(u,v) ,当通过(u,v)的流量为f(u,v)f(u,v)f(u,v)时,需要花费 f(u,v)∗cost(u,v) ...

  3. Random Maze HDU - 4067 费用流/可行流

    主要谈谈建图的原理给自己听 首先贪心出来的一个图上加的边都是可走的[修改边],这些修改边的反向边是用来在跑网络流的时候撤销修改的 换句话说,每条修改边都是备选项,是用来调整图上各点入度的 所以,既然是 ...

  4. HDU - 4780费用流

    题意:M台机器要生产n个糖果,糖果i的生产区间在(si, ti),花费是k(pi-si),pi是实际开始生产的时间机器,j从初始化到生产糖果i所需的时间Cij,花费是Dij,任意机器从生产糖果i到生产 ...

  5. hdu 2448 Mining Station on the Sea(最短路+费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2448 题意:给你一个由N个港口和M个海上油田构成的连通无向图(给出了图中所有的边和权值),现在给你N个 ...

  6. HDU Problem - 1533 Going Home(费用流板子题)

    题目链接 Problem Description On a grid map there are n little men and n houses. In each unit time, every ...

  7. HDU 5383 Yu-Gi-Oh!(费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5383 题意:游戏王同调召唤的方法,每只怪兽有等级和攻击力,两种不同类型的怪兽可以在一定限制下召唤出某一 ...

  8. HDU 4833 Best Financing 一脸费用流的dp

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=4833 题意:中文题不解释... 解题思路: 首先以interest_rates为费用建图跑费用流是比较容易 ...

  9. HDU 3618 Good Plan(费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3618 Problem Description FJ has two same houses for r ...

最新文章

  1. 浏览器执行Python脚本
  2. Master PDF Editor中文版
  3. Prim算法 求出 最小生成树
  4. RabbitMQ RPC远程调用模式
  5. typescript 静态_关于TypeScript静态成员的全部信息| TypeScript OOP
  6. 剑指offer面试题[40]-数组中只出现一次的数字
  7. 摸清Linux日志处理的来龙去脉
  8. Structs2笔记①--structs的背景、structs2框架的意义、第一个helloworld
  9. c语言大作业计算器,C语言实现简单计算器程序
  10. B站ACM算法资源汇总
  11. java万能万年历的程序_Java编写多功能万年历程序的实例分享
  12. 尚硅谷Javase项目一(家庭收支记账软件)
  13. 重要极限二:x趋近于无穷大,(1+1/x)^x的极限
  14. keepalived配置虚拟ip无法ping通解决方法
  15. 数字方法--按零补位
  16. 战略盲区,是看不见,还是不想看见?
  17. 职业作秀V1.7.9更新公告
  18. 用java编写图形用户界面_Java编写图形用户界面程序
  19. petalinux2018.3安装步骤
  20. 输入五个城市从小到大排序-c语言

热门文章

  1. 【压缩率3000%】上交大ICCV:精度保证下的新型深度网络压缩框架
  2. Java开源——常见J2EE框架简介
  3. 心得体悟帖---17、于迷茫低落处找到本心
  4. html标签 marquee 滚动
  5. 敏捷项目管理—敏捷四宣言
  6. Dynamics CRM中的操作(action)是否是一个事务(transaction)?
  7. 阿里云 Ubuntu16.04 部署 LAMP
  8. MySQL服务器修改主机名后问题解决
  9. HDU1114 Piggy-Bank 【全然背包】
  10. poj2478 Farey Sequence (欧拉函数)