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. BUPT复试专题—查找(2011)

    https://www.nowcoder.com/practice/d93db01c2ee44e8a9237d63842aca8aa?tpId=67&tqId=29646&tPage= ...

  2. python requests接收chunked编码问题-python源码修改

    python requests接收chunked编码问题-python源码修改 学习了:https://blog.csdn.net/wangzuxi/article/details/40377467

  3. Visual Studio VS2013模块对于SAFESEH 映像是不安全的 怎么办

    打开该项目的"属性页"对话框,会出现如下界面打开该项目的"属性页"对话框,会出现如下界面   然后单击"链接器"--"命令行&qu ...

  4. CSS3绘制灰太狼动画,绝对精彩

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 关于 thinkPHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback

    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback 关于thinkPHP rpc调 ...

  6. Android-studio 连接真机 调试weex项目

    1.选择项目 platforms  /  android 2.创建虚拟机(AVD) (1)点击 AVD Manager (2) 点击  Create Virtual Device 最后发现 CPU 不 ...

  7. Android 最新控件 Toolbar

    之前Android的ActionBar好像做项目从没用过.除了google自己,并没有多少人用,究其原因,主要是由于ActionBar不够灵活,不可以随心所欲的定制,后来Goole也发现了这一点,然后 ...

  8. leetcode题解||Container With Most Water问题

    problem: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate ...

  9. CPU Stepping

    http://baike.baidu.com/view/16839.htm?fr=ala0_1_1 步进 编辑   步进(Stepping)是CPU的一个重要参数,也叫分级鉴别产品数据转换规范,“步进 ...

  10. Android中Looper的quit方法和quitSafely方法

    Looper是通过调用loop方法驱动着消息循环的进行: 从MessageQueue中堵塞式地取出一个消息.然后让Handler处理该消息,周而复始.loop方法是个死循环方法. 那怎样终止消息循环呢 ...