hdu 4406 费用流
这题问题就是当前时刻究竟选择哪门课程,易知选择是和分数有关的,而且是一个变化的权值,所以能够用拆点的方式,把从基础分到100分都拆成点。但若这样拆点的话,跑费用流时就必须保证顺序。这样就麻烦了。。观察公式。发现同一门课,分数越高。权值是越低的,所以这是一个单调的。这种话就能够对每个分数建一条边。费用流会一条一条的跑。
注意将课程放在X集
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define eps 1e-8
#define MAXN 100
#define MAXM 1000000
#define INF 100000
struct node
{
int u,v,f,next;
double c;
}e[MAXM];
int n,k,head[MAXN],pre[MAXN],vis[MAXN];
double dist[MAXN];
int en,s,t,maxflow,mincost,m; //s源点,t汇点
void add(int u,int v,double c,int f)//加边
{
e[en].u=u;
e[en].v=v;
e[en].c=c;
e[en].f=f;
e[en].next=head[u];
head[u]=en++;
e[en].u=v;
e[en].v=u;
e[en].c=-c;
e[en].f=0;
e[en].next=head[v];
head[v]=en++;
}
int spfa()
{
int i,u,v;
for(i=0;i<=t;i++)
pre[i]=-1,vis[i]=0,dist[i]=-INF;
dist[s]=0;
vis[s]=1;
queue<int>q;
q.push(s);
while(!q.empty())
{
u=q.front();
q.pop();
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(e[i].f>0&&dist[u]+e[i].c-eps>dist[v])
{
dist[v]=dist[u]+e[i].c;
pre[v]=i;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
vis[u]=0;
}
if(dist[t]==-INF)
return 0;
return 1;
}
void add()
{
int v;
int maxf=INF;
for(v=pre[t];~v;v=pre[e[v].u])
maxf=min(maxf,e[v].f);
for(v=pre[t];~v;v=pre[e[v].u])
{
e[v].f-=maxf;
e[v^1].f+=maxf;
mincost+=maxf*e[v].c;
}
maxflow+=maxf;
}
int a[123];
int w[123];
int ADD[123];
int mp[123][123];
void init()
{
maxflow=0;
mincost=0;
s=0;
t=n+m+1;
en=0;
memset(head,-1,sizeof(head));
memset(ADD,0,sizeof(ADD));
}
double cal(int x,int w)
{
return (4.0-3.0*(100.0-x)*(100.0-x)/1600.0)*w;
}
int main()
{
int k,b;
while(~scanf("%d%d%d",&n,&k,&m))
{
if(n+k+m==0) break;
init();
for(int i=1;i<=m;i++) scanf("%d",&w[i]);
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
for(int q=a[i];q<60;q++) add(s,i,INF,1);
for(int q=max(a[i],60);q<100;q++) add(s,i,cal(q+1,w[i])-cal(q,w[i]),1);
}
for(int i=1;i<=n;i++)
{
add(m+i,t,0,k);
for(int j=1;j<=m;j++)
{
scanf("%d",&b);
if(b) add(j,m+i,0,INF);
}
}
while(spfa()) add();
for(int i=head[s];~i;i=e[i].next)
{
if(e[i].v>=1&&e[i].v<=m&&e[i].f==0) ADD[e[i].v]++;
}
int ok=1;
for(int i=1;i<=m;i++)
{
if(a[i]+ADD[i]<60)
{
ok=0;
break;
}
a[i]+=ADD[i];
}
if(ok==0)
{
puts("0.000000");
}
else
{
double ans=0;
int d=0;
for(int i=1;i<=m;i++)
{
ans+=cal(a[i],w[i]);
d+=w[i];
}
printf("%.6lf\n",ans/d);
}
}
return 0;
}
hdu 4406 费用流的更多相关文章
- Going Home HDU - 1533 费用流
http://acm.hdu.edu.cn/showproblem.php?pid=1533 给一个网格图,每两个点之间的匹配花费为其曼哈顿距离,问给每个的"$m$"匹配到一个&q ...
- hdu 5045 费用流
滚动建图,最大费用流(每次仅仅有就10个点的二分图).复杂度,m/n*(n^2)(n<=10),今年网络赛唯一网络流题,被队友状压DP秒了....难道网络流要逐渐退出历史舞台???.... #i ...
- HDU 3376 费用流 Matrix Again
题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在 ...
- hdu 2686 费用流 / 双线程DP
题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1 费用流法:思路转化:从左 ...
- hdu 1853 (费用流 拆点)
// 给定一个有向图,必须用若干个环来覆盖整个图,要求这些覆盖的环的权值最小. 思路:原图每个点 u 拆为 u 和 u' ,从源点引容量为 1 费用为 0 的边到 u ,从 u' 引相同性质的边到汇点 ...
- HDU 3667 费用流 拆边 Transportation
题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...
- HDU 3667 费用流(拆边)
题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c ...
- HDU 5644 (费用流)
Problem King's Pilots (HDU 5644) 题目大意 举办一次持续n天的飞行表演,第i天需要Pi个飞行员.共有m种休假计划,每个飞行员表演1次后,需要休假Si天,并提供Ti报酬来 ...
- HDU - 4780费用流
题意:M台机器要生产n个糖果,糖果i的生产区间在(si, ti),花费是k(pi-si),pi是实际开始生产的时间机器,j从初始化到生产糖果i所需的时间Cij,花费是Dij,任意机器从生产糖果i到生产 ...
随机推荐
- LuoguP2774 方格取数问题(最小割)
题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...
- 【Codeforces Round #456 (Div. 2) B】New Year's Eve
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然10000..取到之后 再取一个01111..就能异或成最大的数字了. [代码] /* 1.Shoud it use long ...
- iOS_31_cocos2d_微信飞机
终于效果图: 纹理素材 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400 ...
- actionmode-ActionMode以及它的menu使用
下图左边效果为Context Menu右边效果为ActionMode. ActionMode 其实就是替换在actionbar的位置上显示的一个控件.它跟actionbar一样,也是一种导航作用.只不 ...
- 38..Node.js工具模块---底层的网络通信--Net模块
转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js Net 模块提供了一些用于底层的网络通信的小工具,包含了创建服务器/ ...
- 3.第一个Node.js程序:Hello World!
转自:http://www.runoob.com/nodejs/nodejs-tutorial.html 以下是我们的第一个Node.js程序: console.log("Hello Wor ...
- 洛谷P2147 [SDOI2008]Cave 洞穴勘测
题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...
- JavaFx EventHandler
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHan ...
- golang中new和make区别
golang 中有两个内存分配机制 :new和make,二者有明显区别. new:用来初始化一个对象,并且返回该对象的首地址.其自身是一个指针.可用于初始化任何类型 make:返回一个初始化的实例,返 ...
- Appium_python3 抓取客户端toast
在客户端登录或者退出登录的时候会有吐司提示,因此需要抓取来验证用户登录成功或者注销成功: 在获取toast之前需要添加 desired_caps['automationName'] = 'Uiau ...