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. zedboard中OLED源码

    #include <stdio.h> #include "platform.h" #include "xil_types.h" #include & ...

  2. html中跳转方法(含设定时间)

    脚本方式 如: <script language="JavaScript" type="text/JavaScript"> <!-- wind ...

  3. net spy memcached 使用demo

    package memcached; import java.io.IOException; import java.net.InetSocketAddress; import net.spy.mem ...

  4. HDU 3342 Legal or Not (最短路 拓扑排序?)

    Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. ubuntu 系统启动时找不到根文件系统

    报出的错误大概为: Alert! /dev/disk/by-uuid/ ....... does not exist 最后进入了 initramdiskfs 的命令行终端 . 输入 blkid 命令却 ...

  6. C++类中static修饰的函数的使用

    //在C++中应该养成习惯:只用静态成员函数引用静态成员数据,而不引用非静态成员数据 #include <iostream>using namespace std;class st_inf ...

  7. Hadoop之HDFS文件操作

    摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

  8. HBase2.0新特性之In-Memory Compaction

    In-Memory Compaction是HBase2.0中的重要特性之一,通过在内存中引入LSM结构,减少多余数据,实现降低flush频率和减小写放大的效果.本文根据HBase2.0中相关代码以及社 ...

  9. searchkick HasMany Associations | index related model fields

    Project < ActiveRecord::Base searchkick has_many :categories_has_projects has_many :categories, t ...

  10. javascript 阻止事件冒泡 cancelBubble

    javascript简单的阻止事件冒泡,可以使用事件的cancelBubble方法为true: html部分 <button id="btn1">点击显示div< ...