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到生产 ...
随机推荐
- kali之Nmap (Network Mapper(网络映射器)
Nmap是主机扫描工具,他的图形化界面是Zenmap,分布式框架为Dnamp. Nmap可以完成以下任务: 主机探测 端口扫描 版本检测 系统检测 支持探测脚本的编写 Nmap在实际中应用场合如下: ...
- 【hdu 6038】Function
[Link]:http://codeforces.com/contest/834/problem/C [Description] 给你两个排列a和b; a排列的长度为n,b排列的长度为m; a∈[0. ...
- Funui-Theme 资源的替换
实现资源的替换,需要分为以下几个步骤 1.找到需要更改的模块 mediatek/packages/apps/FileManager 2.到主题模块下根据包名找到相应资源(以Grass为例) cd ve ...
- H5+混合移动app
H5+混合移动app 前言 经过2个多月的艰苦奋斗,app的第一个版本已经快完工了,期间遇到了太多的坑,作为一个喜欢分享的人,我当然不会吝啬分享这爬坑历程.不要问我有多坑,我会告诉你很多,很多.... ...
- BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...
- WSDL生成dll
--生成代理类wsdl /l:cs /n:OAWebService /out:D:OAWebService.cs D:\OAWebService.WSDL--生成dllcsc /out:D:OAWeb ...
- webservie授权调用
Dim usercode As String = System.Configuration.ConfigurationSettings.AppSettings("SAPWebServiceU ...
- js引入广告服务
var header = []; header[1] = { 'title' : '新浪开始进军微博大战', 'pic' : 'images/header1.png', 'link' : 'http: ...
- SUSE Linux Enterprise Server 11 64T 安装(带清晰视频)
SUSE Linux Enterprise Server 11 64T 安装实录 650) this.width=650;" onclick='window.open("http: ...
- DG观察日志传输
--primary端查询v$archived_log视图,确认日志是否被应用: set lines 300 pages 300 col name for a20 select name,dest_ ...