https://www.luogu.org/problemnew/show/P4452

又一道看题解的费用流。

注意时间也影响节点,像题解那样建边就少很多了。

#include<bits/stdc++.h>
using namespace std; const int MAXN=+;
const int MAXM=;
const int INF=0x3f3f3f3f;
struct Edge{
int to,next,cap,flow,cost;
}edge[MAXM];
int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN]; int n;
void init(){
tol=;
memset(head,-,sizeof(head));
} void addedge(int u,int v,int cap,int cost){
edge[tol].to=v;
edge[tol].cap=cap;
edge[tol].cost=cost;
edge[tol].flow=;
edge[tol].next=head[u];
head[u]=tol++; edge[tol].to=u;
edge[tol].cap=;
edge[tol].cost=-cost;
edge[tol].flow=;
edge[tol].next=head[v];
head[v]=tol++;
} bool spfa(int s,int t){
queue<int> q;
memset(dis,INF,sizeof(dis));
memset(vis,false,sizeof(vis));
memset(pre,-,sizeof(pre)); dis[s]=;
vis[s]=true;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost){
dis[v]=dis[u]+edge[i].cost;
pre[v]=i;
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
if(pre[t]==-)
return false;
else
return true;
} int minCostMaxFlow(int s,int t,int &cost){
int flow=;
cost=;
while(spfa(s,t)){
int Min=INF;
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
if(Min>edge[i].cap-edge[i].flow)
Min=edge[i].cap-edge[i].flow;
}
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
edge[i].flow+=Min;
edge[i^].flow-=Min;
cost+=edge[i].cost*Min;
}
flow+=Min;
}
return flow;
}
/*
int main(){
int M,S,T;
scanf("%d%d%d%d",&N,&M,&S,&T);
init(N);
while(M--){
int u,v,cap,cost;
scanf("%d%d%d%d",&u,&v,&cap,&cost);
addedge(u,v,cap,cost);
}
int cost=0;
int flow=minCostMaxFlow(S,T,cost); printf("%d %d\n",flow,cost);
}*/ int getid(int id,int T){
return T*+id;
} int g[][]={};
int co[][]={}; struct Node{
int a,b,s,t,c;
}node[]; int main() {
init();
int s=,s1=,T,m,k;
scanf("%d%d%d%d",&n,&m,&k,&T);
int t=getid(,T); addedge(s1,s,k,);//不超过k架飞机
for(int i=;i<n;i++){
for(int j=;j<n;j++){
scanf("%d",&g[i][j]);
}
}
for(int i=;i<n;i++){
for(int j=;j<n;j++){
scanf("%d",&co[i][j]);
}
} for(int i=;i<n;i++){
int ti=g[i][];
int u=getid(i,T-ti);
addedge(u,t,k,co[i][]);
} for(int i=;i<m;i++){
scanf("%d%d%d%d%d",&node[i].a,&node[i].b,&node[i].s,&node[i].t,&node[i].c);
int u=getid(node[i].a,node[i].s),v=getid(node[i].b,node[i].t);
addedge(u,v,,-node[i].c);
} for(int i=;i<m;i++){
for(int j=;j<m;j++){
if(node[j].t+g[node[j].b][node[i].a]<=node[i].s){
int u=getid(node[j].b,node[j].t);int v=getid(node[i].a,node[i].s);
addedge(u,v,,co[node[j].b][node[i].a]);
} }
if(g[][node[i].a]<=node[i].s){
int u=;int v=getid(node[i].a,node[i].s);
addedge(u,v,,co[][node[i].a]);
}
if(node[i].t+g[node[i].b][]<=T){
int u=getid(node[i].b,node[i].t);int v=t;
addedge(u,v,,co[node[i].b][]);
}
}
/*for(int ti=0;ti<T;ti++){
for(int u=0;u<n;u++){
addedge(getid(u,ti),getid(u,ti+1),k,0);
}
}*/ /*while(m--){
int t1,a,t2,b,cost;
scanf("%d%d%d%d%d",&a,&b,&t1,&t2,&cost);
int u=getid(a,t1),v=getid(b,t2);
addedge(u,v,1,-cost);
for(int i=0;i<n;i++){
if(i==a)
continue;
int ti=g[i][a];
if(t1-ti>=0)
addedge(getid(i,t1-ti),u,1,co[i][a]);
}
// cout<<"cost="<<cost<<endl;
}*/ int cost;
int flow=minCostMaxFlow(s1,t,cost);
printf("%d\n",-cost);
}

洛谷 - P4452 - 航班安排 - 费用流的更多相关文章

  1. 洛谷.4015.运输问题(SPFA费用流)

    题目链接 嗯..水题 洛谷这网络流二十四题的难度评价真神奇.. #include <queue> #include <cstdio> #include <cctype&g ...

  2. 洛谷P4015 运输问题(费用流)

    传送门 源点向仓库连费用$0$,流量为储量的边,商店向汇点连费用$0$,流量为需求的边,然后仓库向商店连流量$inf$,费用对应的边,跑个费用流即可 //minamoto #include<io ...

  3. 洛谷P4014 分配问题(费用流)

    传送门 可以把原图看做一个二分图,人在左边,任务在右边,求一个带权的最大和最小完美匹配 然而我并不会二分图做法,所以只好直接用费用流套进去,求一个最小费用最大流和最大费用最大流即可 //minamot ...

  4. 洛谷.3381.[模板]最小费用最大流(zkw)

    题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...

  5. [洛谷P2365] 任务安排

    洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...

  6. BZOJ 2245: [SDOI2011]工作安排( 费用流 )

    费用流模板题..限制一下不同愤怒值的工作数就可以了. ------------------------------------------------------------------------- ...

  7. 【bzoj2245】[SDOI2011]工作安排 费用流

    题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...

  8. 洛谷P2365 任务安排(斜率优化dp)

    传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...

  9. P2488 [SDOI2011]工作安排 费用流

    \(\color{#0066ff}{ 题目描述 }\) 你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小.由于我们并不想使用Special Judge,也为了使选手 ...

随机推荐

  1. weex 项目开发(四)项目框架搭建 及 自定义 TabBar 组件

    1.安装  路由模块  及  状态管理模块 npm install vue-router --save npm install vuex --save 2.自定义  TabBar  组件 src / ...

  2. 嵌入式程序员应知道的0x10个C语言Tips

    [1].[代码] [C/C++]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

  3. NDK编译STL

    方法: 1.在jni目录下新建Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个: system - 使用默认最小的C++运行库, ...

  4. C#语法复习3

    第七章 类与继承 1.虽然派生类不能删除基类的的任何成员,但我们可以利用在派生类当中声明与基类成员名称相同的成员来屏蔽基类成员.这叫 覆盖. 一种是隐式屏蔽.一种是显式屏蔽.所谓 显式就是 加上一个n ...

  5. 一场由股票提醒助手插件引发的血案——浅入浅出 jquery autocomplete

    我没有学过前端,所以这篇文章注定要班门弄斧了. 通常,须要用到什么技术什么语言时,我才去学,学了也不一定掌握,就是记不住!所以如今明确了.学习的时候,亦或是攻克难点的时候,一定要记录下来.并不一定非要 ...

  6. window.open() 父子页面的传值问题

    if(window.opener){//判断是否有父窗口,即打开本页面的窗口       window.opener.location.reload();//刷新父窗口       window.op ...

  7. const成员函数总结

    const 成员函数: 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作不论什么改变. 在设计类的时候.一个原则就是对于不改变数据成员的成员函数都要 ...

  8. 统计nginx日志单IP访问请求数排名

    下面是我截取一段nginx日志 /Jan/::: +] "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gec ...

  9. Guava Cache在实际项目中的应用

    对于Guava Cache本身就不多做介绍了,一个非常好用的本地cache lib,可以完全取代自己手动维护ConcurrentHashMap. 背景 目前需要开发一个接口I,对性能要求有非常高的要求 ...

  10. string和int互相转化

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...