[bzoj1070][SCOI2007]修车_费用流
修车 bzoj-1070 SCOI-2007
题目大意:有m个人要修n台车,每个工人修不同的车的时间不同,问将所有的车都修完,最少需要花费的时间。
注释:$2\le m\le 9$,$1\le n \le 60$
想法:想起了那句话...(如果题面复杂,dp状态不可描述,一看数据范围发现才几百,那八成是网络流了),一般这句话都是对的,除了那次在CF上遇到的爆搜.. ...
关于这道题,网上有题解在边上做技巧(完全没明白这样的意义),我的做法时拆点。将每个点拆成n个,然后在这些被拆的点与车之间连边即可,保证每走一条边需要将之后的费用都统计进来。
具体地,将一个j工人拆成n个点,第k个点表示这个工人倒数第k个修车i,那么车i向工人j连一条容量为1,费用为k*w[i][j],表示修自己的车的一个费用,和后面k-1个人等待的费用,就是算自己费用的同时算上别人的费用。注意这样倒着考虑,每个车连的边就只对关于同一个工人但是在他后面修车的有影响。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
#define N 610
#define M 76010
#define INF 0x3f3f3f
long long ans;
struct node{
int x,y,co,next,cap;
}edge[M];
int head[N],dis[N],pre[N];
bool vis[N];
int l,m,n,t,s,w;
void add(int x,int y,int c,int z)
{
l++;
edge[l].x=x;edge[l].y=y;edge[l].co=z;edge[l].cap=c;
edge[l].next=head[x];
head[x]=l;
}
bool spfa()
{
queue<int> q;
for(int i=0;i<=t;i++) {dis[i]=INF;vis[i]=0;}
memset(pre,0,sizeof(pre));
vis[s]=1;dis[s]=0;
q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=0;
for (int i=head[x];i!=-1;i=edge[i].next)
{
int y=edge[i].y;
if (edge[i].cap && dis[x]+edge[i].co<dis[y])
{
pre[y]=i;
dis[y]=edge[i].co+dis[x];
if (!vis[y]) q.push(y), vis[y]=1;
}
}
}
if (dis[t]<INF) return 1; else return 0;
}
void minf()
{
int i=pre[t],cap=INF;
while(i)
{
cap=min(cap, edge[i].cap);
i=pre[edge[i].x];
}
i=pre[t];
while(i)
{
edge[i].cap-=cap;
edge[i^1].cap+=cap;
ans+=cap*edge[i].co;
i=pre[edge[i].x];
}
}
int main()
{
scanf("%d%d", &m, &n);
l=1;
memset(head,-1,sizeof head);
t=n+m*n+1;s=0;
for(int i=1;i<=n;i++)
{
add(s,i,1,0);
add(i,s,0,0);
for(int j=1;j<=m;j++)
{
scanf("%d", &w);
for(int k=1;k<=n;k++)
{
add(i, j*n+k, 1, k*w);
add(j*n+k, i, 0, -k*w);
}
}
}
for(int j=n+1;j<=m*n+n;j++)
{
add(j,t,1,0);
add(t,j,0,0);
}
ans=0;
while(spfa()) minf();
printf("%.2lf\n", (double)ans / n);
}
小结:记住一些题目的描述,有利于帮助我门迅速分析出切入点。
[bzoj1070][SCOI2007]修车_费用流的更多相关文章
- BZOJ_1070_[SCOI2007]修车_费用流
BZOJ_1070_[SCOI2007]修车_费用流 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
- bzoj1070: [SCOI2007]修车(费用流)
1070: [SCOI2007]修车 题目:传送门 题解: 一道挺简单的费用流吧...胡乱建模走起 贴个代码... #include<cstdio> #include<cstring ...
- 2018.10.13 bzoj1070: [SCOI2007]修车(费用流)
传送门 费用流经典题目. 自我感觉跟TheWindy′sThe Windy'sTheWindy′s很像. 利用费用提前计算的思想来建图就行了. 代码: #include<bits/stdc++. ...
- P2053 [SCOI2007]修车(费用流)
P2053 [SCOI2007]修车 顾客平均等待的最小时间$=$等待总时间$/n$ 考虑只有1个技术人员时,$n$辆车等待总时间 $A_1+(A_1+A_2)+(A_1+A_2+A_3)+...+\ ...
- 【BZOJ1070】修车(费用流)
题意:同一时刻有N位车主带着他们的爱车来到了汽车维修中心. 维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. 现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- 【洛谷2053】 [SCOI2007]修车(费用流)
传送门 洛谷 Solution 考虑把每一个修车工人拆成\(n\)个点,那么考虑令\(id(i,j)\)为第\(i\)个工人倒数第\(j\)次修车. 然后就可以直接跑费用流了!!! 代码实现 /* m ...
- BZOJ1070[SCOI2007]修车——最小费用最大流
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- [BZOJ 1070] [SCOI2007] 修车 【费用流】
题目链接:BZOJ - 1070 题目分析 首先想到拆点,把每个技术人员拆成 n 个点,从某个技术人员拆出的第 i 个点,向某辆车连边,表示这是这个技术人员修的倒数第 i 辆车.那么这一次修车对整个答 ...
- 【BZOJ】1070: [SCOI2007]修车(费用流+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 好神的题!!!orz 首先我是sb不会拆点..... 首先,每一个技术人员维修车辆都有一个先后 ...
随机推荐
- 1D1D动态规划优化
1D1D动态规划优化 1D/1D 动态规划优化初步所谓1D/1D 动态规划,指的是状态数为O(n),每一个状态决策量为O(n)的动态规划方程.直接求解的时间复杂度为O(n2),但是,绝大多数这样的方程 ...
- codeforces 899F Letters Removing set+树状数组
F. Letters Removing time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Error-MySQL:2005 - Unknown MySQL server host 'localhost'(0)
ylbtech-Error-MySQL:2005 - Unknown MySQL server host 'localhost'(0) 1.返回顶部 1. 今天在外面开navicat for mysq ...
- 杂项-Java:标签库
ylbtech-杂项-Java:标签库 1.返回顶部 1. JSP标签库,也称自定义标签库,可看成是一种通过JavaBean生成基于XML的脚本的方法.从概念上讲,标签就是很简单而且可重用的代码结构. ...
- 0507-php独立环境的安装与配置
1.在一个纯英文目录下新建三个文件夹 2.安装apache(选择好版本) 过程中该填的按格式填好,其余的只更改安装目录即可 如果报错1901是安装版本的问题. 检查:安装完成后localhost打开为 ...
- php获得本机ipv4地址
if (isset($_ENV["HOSTNAME"])) $MachineName = $_ENV["HOSTNAME"]; else if (isset($ ...
- [转]"RDLC"报表-参数传递及主从报表
本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/09/19/2180940.html 今天继续学习RDLC报表的“参数传递”及“主从报表” 一.先创建D ...
- ACM_小明滚出去?(求逆序数)
小明滚出去? Time Limit: 2000/1000ms (Java/Others) Problem Description: 老师:“小明,写一个排序算法”: 小明: void mysort(i ...
- android平台 cocos2d-x 读取相册数据
现已解决 方案如下: 1.使用 jni 调用 java 方法 启动相册选择框2.使用java将获取的图片保存到本地3.使用Cocos2d-x中 CCImage 读取 JAVA代码如下: //启动图片选 ...
- Spring Cloud (1) 服务的注册与发现(Eureka)
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...