题意:现有m门课程需要复习,已知每门课程的基础分和学分,共有n天可以复习,每天分为k个时间段,每个时间段可以复习一门课程,并使这门课程的分数加一,问在不挂科的情况下最高的绩点。

思路:(没做过费用流的转这里:http://www.cnblogs.com/L-King/p/5316359.html),首先我们得保证每门课程都达到60分,所以对每一门未到60分的课程添加一条从S(即源点)出发的弧,容量为60-该课程的分数,花费为INF,因此在执行费用流的时候会优先增广此弧。此时,我们已经保证了在条件允许的情况下,每门课程都达到60分以上。接下来就是剩下的分数的分配,设f(x)为x对应的p;可解得f(x)以及f'(x)都是减函数(x>=60),即f(x+1)-f(x)<f(x)-f(x-1),因此可以对每一分连接一条容量为1,费用为f(x)-f(x-1)的弧。最后就是每门课程与对应的天连接一条容量为k,费用为0的弧,每一天与T(即汇点)连接一条容量为k,费用为0的弧。最后跑一下费用流,然后判断是否有课程未达到60分。

代码:

#include<stdio.h>
#include<string.h>
#define min(x,y) (x)<(y)?(x):(y) const int N=,M=,INF=0x3f3f3f3f;
struct node
{
int u,v,c,next;
double w;
}e[M];
int head[N],q[M],p[N],pre[N];
int s,t,l,r,cnt;
double d[N];
int w[N],b[N],f[N];
void add(int u,int v,int c,double w)
{
e[cnt].u=u,e[cnt].v=v,e[cnt].c=c,e[cnt].w=w;
e[cnt].next=head[u],head[u]=cnt++;
e[cnt].u=v,e[cnt].v=u,e[cnt].c=,e[cnt].w=-w;
e[cnt].next=head[v],head[v]=cnt++;
}
void init()
{
memset(head,-,sizeof(head));
cnt=;
} int spfa()
{
int i,u,v;
double w;
memset(pre,-,sizeof(pre));
memset(p,,sizeof(p));
memset(f,,sizeof(f));
for(i=;i<=t;i++) d[i]=-1.0*INF;
l=r=;d[s]=;f[s]=INF;q[++r]=s;
while(l<r)
{
p[u=q[++l]]=;
for(i=head[u];i!=-;i=e[i].next)
{
v=e[i].v,w=e[i].w;
if(e[i].c&&d[v]<d[u]+w)
{
d[v]=d[u]+w;
f[v]=min(f[u],e[i].c);
pre[v]=i;
if(!p[v])
{
q[++r]=v;
p[v]=;
}
}
}
}
return f[t];
} double getp(int x,int w)
{
return (4.0-3.0*(-x)*(-x)/)*w;
}
void MicMaf()
{
int m;
while(m=spfa())
{
for(int i=pre[t];i!=-;i=pre[e[i].u])
{
e[i].c-=m;
e[i^].c+=m;
}
}
}
int main()
{
int n,m,k,i,j,x;
while(scanf("%d%d%d",&n,&k,&m),n||m||k)
{
init();s=,t=n+m+;
for(i=;i<=m;i++) scanf("%d",&w[i]);
for(i=;i<=m;i++) scanf("%d",&b[i]);
for(i=;i<=n;i++)
{
add(i+m,t,k,);
for(j=;j<=m;j++)
{
scanf("%d",&x);
if(x) add(j,i+m,k,);
}
}
double pre,cur;
for(i=;i<=m;i++)
{
if(b[i]<)
{
add(s,i,-b[i],1.0*INF);
pre=getp(,w[i]);
for(j=;j<=;j++)
{
cur=getp(j,w[i]);
add(s,i,,cur-pre);
pre=cur;
}
}
else
{
pre=getp(b[i],w[i]);
for(j=b[i]+;j<=;j++)
{
cur=getp(j,w[i]);
add(s,i,,cur-pre);
pre=cur;
}
}
}
MicMaf();
for(i=head[s];i!=-;i=e[i].next)
b[e[i].v]+=e[i^].c;
int sum=;double ans=;
for(i=;i<=m;i++)
sum+=w[i];
for(i=;i<=m;i++)
{
if(b[i]<) break;
ans+=getp(b[i],w[i])/sum;
}
if(i<=m) ans=;
printf("%.6f\n",ans);
}
return ;
}

参考文章:http://www.cnblogs.com/jianglangcaijin/archive/2012/10/06/2713375.html

     http://www.xuebuyuan.com/2064806.html

HDU 4406 最大费用最大流的更多相关文章

  1. hdu 4322(最大费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4322 思路:建图真的是太巧妙了!直接copy大牛的了: 由于只要得到糖就肯定有1个快乐度,在这一点上糖 ...

  2. 【网络流#2】hdu 1533 - 最小费用最大流模板题

    最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...

  3. hdu 1533(最小费用最大流)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. hdu 4862KM&最小费用最大流

    /*最小K路径覆盖的模型,用费用流或者KM算法解决, 构造二部图,X部有N*M个节点,源点向X部每个节点连一条边, 流量1,费用0,Y部有N*M个节点,每个节点向汇点连一条边,流量1, 费用0,如果X ...

  5. HDU 4322Candy 最大费用最大流

    由于被小孩子不喜欢的糖果的对小孩产生的效力是一样的,所以我们在网络流的时候先不考虑. 1 - 源点0到1~N个糖果,容量为1,费用为02 - 根据like数组,like[i][j] == 1时在糖果j ...

  6. hdu 4067(最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4067 思路:很神奇的建图,参考大牛的: 如果人为添加t->s的边,那么图中所有顶点要满足的条件都 ...

  7. HDU 1533 最小费用最大流(模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 这道题直接用了模板 题意:要构建一个二分图,家对应人,连线的权值就是最短距离,求最小费用 要注意void ...

  8. hdu 3667(最小费用最大流+拆边)

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. hdu 2485(最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2485 思路:题目的意思是删除最少的点使1,n的最短路大于k.将点转化为边,容量为1,费用为0,然后就是 ...

随机推荐

  1. Angular框架

    Angular 框架 Angular介绍 库和框架的区别 jQuery:库 库一般都是封装了一些常用的方法 自己手动去调用这些方法,来完成我们的功能 code $('#txt').val('我是小明' ...

  2. 生理周期(c++实现)

    描述:人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23 天. 28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维 ...

  3. Microsoft Dynamics CRM 2011/2013 JS操作集锦

    1.Xrm.Page.context用户ID:getUserId()用户角色:getUserRoles()用户语言:getUserLcid()组织名称:getOrgUniqueName()组织语言:g ...

  4. SharePoint 服务器端对象模型操作文档库(上传/授权/查看权限)

    简介:上传文档到文档库,并对项目级授权,查看项目级权限方法         //在列表根目录下创建文件夹 public static string CreatFolderToSPDocLib(stri ...

  5. How does Web Analytics works under sharePoint 2010

    [http://gokanx.wordpress.com/2013/06/15/how-does-web-analytics-works-under-sharepoint-2010/] You nee ...

  6. android ButterKnife 解决重复findViewById

    简介: 程序员都是懒惰的,不想写一大堆像下面这样的代码 class ExampleActivity extends Activity { TextView title; TextView subtit ...

  7. IOS中程序如何进行推送消息(本地推送,远程推送)2(上)

    未看过本地推送的,可以提前看一下本地推送. http://www.cnblogs.com/wolfhous/p/5135711.html =============================== ...

  8. TCP/IP协议握手过程详解

    1,建立连接 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示. (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SE ...

  9. Servlet开发配置

    本文主要简单实践一下servlet开发相关开发 1.Servlet的创建 两种方法: 创建普通的java类,继承自HttpServlet类,在通过手动配置web.xml文件注册Servlet对象,比较 ...

  10. Spring(八)SSH整合简述

    一.Spring与Struts2的整合 1.1.整合步骤 1.2.配置web.xml 1.3.配置spring配置文件applicationContext.xml 1.4.配置struts配置文件 1 ...