[bzoj1070][SCOI2007]修车[ 网络流]
把每个工人拆成N个点。记为A[i,j]表示第i个工人修倒数第j辆车.每个车跟所有N*M个工人拆出的点连边。流量为1,费用为$time[i,j]*k$。源和每辆车连边,N*M个点和汇连边,流量都为1,费用同为0。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cmath>
#include <queue> using namespace std; template<const int _n,const int _m>
struct Edge
{
struct Edge_base { int to,next,w,c; }e[_m]; int cnt,p[_n];
void clear() { cnt=,memset(p,,sizeof(p)); }
Edge() { clear(); }
void insert(const int x,const int y,const int z,const int zz)
{ e[++cnt].to=y; e[cnt].next=p[x]; e[cnt].w=z; e[cnt].c=zz; p[x]=cnt; return ; }
void link(const int x,const int y,const int z,const int zz)
{ insert(x,y,z,zz); insert(y,x,,-zz); }
int start(const int x) { return p[x]; }
Edge_base& operator[](const int x) { return e[x]; }
}; int n,m,Time[][],SSS,TTT,Cost;
int Dis[],cur[];
bool visited[];
Edge<,>e; bool Spfa(const int S)
{
int i,t,temp;
queue<int> Q;
memset(Dis,0x3f,sizeof(Dis));
Dis[S]=;
visited[S]=true;
Q.push(S);
while(!Q.empty())
{
t=Q.front();Q.pop();visited[t]=false;
for(i=e.start(t);i;i=e[i].next)
{
temp=e[i].to;
if(e[i].w && Dis[t]+e[i].c<Dis[temp])
{
Dis[temp]=Dis[t]+e[i].c;
if(!visited[temp])
{
visited[temp]=true;
Q.push(temp);
}
}
}
}
return Dis[TTT]!=0x3f3f3f3f;
} int Dfs(const int S,const int bk)
{
visited[S]=true;
if(S==TTT)return bk;
int rest=bk;
for(int &i=cur[S];i;i=e[i].next)
{
if(!visited[e[i].to] && Dis[S]+e[i].c==Dis[e[i].to] && e[i].w)
{
int flow=Dfs(e[i].to,min(rest,e[i].w));
Cost+=flow*e[i].c;
e[i].w-=flow;
e[i^].w+=flow;
if((rest-=flow)<=)break;
}
}
if(bk==rest)Dis[S]=0x3f3f3f3f;
return bk-rest;
} int Zkw()
{
while(Spfa(SSS))
{
do
{
memset(visited,,sizeof(visited));
memcpy(cur,e.p,sizeof(cur));
Dfs(SSS,0x3f3f3f3f);
}while(visited[TTT]);
}
return Cost;
} int main()
{
int i,j,k; scanf("%d%d",&n,&m);
for(i=;i<=m;++i)
for(j=;j<=n;++j)
scanf("%d",&Time[i][j]);
SSS=n*m+m+,TTT=SSS+;
for(i=;i<=n*m;++i)e.link(SSS,i,,);
for(i=n*m+;i<SSS;++i)e.link(i,TTT,,);
for(k=;k<=m;++k)
for(i=;i<=n;++i)
for(j=;j<=m;++j)
e.link((i-)*m+j,n*m+k,,Time[k][i]*j);
printf("%.2lf\n",(double)Zkw()/m);
return ;
}
[bzoj1070][SCOI2007]修车[ 网络流]的更多相关文章
- [bzoj1070][SCOI2007]修车_费用流
修车 bzoj-1070 SCOI-2007 题目大意:有m个人要修n台车,每个工人修不同的车的时间不同,问将所有的车都修完,最少需要花费的时间. 注释:$2\le m\le 9$,$1\le n \ ...
- [BZOJ1070][SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 6209 Solved: 2641[Submit][Status] ...
- bzoj1070: [SCOI2007]修车(费用流)
1070: [SCOI2007]修车 题目:传送门 题解: 一道挺简单的费用流吧...胡乱建模走起 贴个代码... #include<cstdio> #include<cstring ...
- BZOJ1070: [SCOI2007]修车(最小费用最大流,思维)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- BZOJ1070 [SCOI2007]修车
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 洛谷$P2053\ [SCOI2007]$修车 网络流
正解:网络流 解题报告: 传送门$QwQ$ 一个很妙的建图,,,说实话我麻油想到$QwQ$ 考虑对每个工人建$n$个点,表示这是他修的倒数第$i$辆车,就可以算出影响是$t\cdot i$,然后对每辆 ...
- [BZOJ1070][SCOI2007]修车(最小费用最大流)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1070 分析: 把每个工人拆成N个点.记为A[i,j]表示第i个工人修倒数第j辆车. 每 ...
- [bzoj1070][SCOI2007]修车——费用流
题目大意: 传送门 题解: 本题和(POJ3686)[http://poj.org/problem?id=3686]一题一模一样,而且还是数据缩小以后的弱化版QAQ,<挑战程序设计竞赛>一 ...
- [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
随机推荐
- C基础-对malloc的使用与理解
一.malloc函数分析 1.函数原型 void * malloc(size_t size); 2.Function(功能) Allocates a block of size bytes of m ...
- S - Cyclic Components (并查集的理解)
Description You are given an undirected graph consisting of nn vertices and mm edges. Your task is t ...
- EasyUI系列学习(十)-Tabs(选项卡)
一.创建组件 <div class="easyui-tabs" style="width:500px;height:250px"> <div ...
- Android 网络图片查看器与网页源码查看器
在AndroidManifest.xml里面先添加访问网络的权限: <uses-permission android:name="android.permission.INTERNET ...
- Android基础TOP5_5:设置没有标题栏而且用系统壁纸当背景的界面
在res/values目录下的style.xml设置如下 <style name="AppBaseTheme" parent="android:Theme.Wall ...
- 用DataReader 分页与几种传统的分页方法的比较
对于数据库的分页,目前比较传统的方法是采用分页存储过程,其实用 DataReader 也可以实现分页,不需要写存储过程,实现效率上也比几种比较流行的分页方法要略快. 在开始这个方法之前,让我们先创建一 ...
- 什么是vuejs之重新认识vuejs
什么是vuejs? 1.它是一个轻量级的mvvm框架 2.数据驱动+组件化的前端开发 3.github超过25k+的stat数,社区完善 4.vuejs更轻量,gzip后大小只有20k+ 5.vuej ...
- python学习笔记(4)——list[ ]
发现个问题,python与C.JAVA等语言相比学习障碍最大差别居然在于版本更迭!这是python官方造的虐啊... 有时针对某问题去google答案,或者自己去博客找共性解答,会出现相互矛盾或者与你 ...
- 外观模式(Facade)-子系统的协作与整合-接口模式
对子系统进行整合,对外提供更强大或更便捷的接口. 在一个模块和几个子系统进行通信时考虑. 什么是外观模式? 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口 ...
- CAD使用GetxDataString读数据(网页版)
主要用到函数说明: MxDrawEntity::GetxDataString2 读取一个字符扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...