BZOJ 2696 航班安排 費用流

2021-07-28 10:17:15 字數 1329 閱讀 2192

題目大意:k架飛機,n個機場,以0..n-1編號,其中0號為基地機場,每天0時刻起飛機從該機場起飛,並不晚於t時刻回到該機場。m個包機請求,每個請求為在s時刻從a機場起飛,在恰好t時刻到達b機場,可以淨獲利c。機場之間來往有花費。求最大收益。

將每乙個請求拆成兩個點,在兩個點之間連一條費用為負的完成請求x的利潤,流量為1的邊,表示完成請求獲得了利潤且只能完成一次。在0時刻可以選擇完成任意乙個請求x,若能不晚於請求x開始的時間到達請求x的起始點,則連一條從s到x,費用為從基地到x的起始點的花費,容量為inf的邊;在完成乙個請求後可以選擇完成另乙個請求或是直接返回基地,若能不晚於規定時間t回到基地,則連一條從x到t,費用為負的請求x的結束點到基地的費用,容量為inf的邊;再判斷請求之間的關係,若完成乙個請求x後能從請求x的結束點另乙個請求y開始的時間之前到達請求y的起始點,就連一條從x到y,費用為從x的結束點到y的開始點的花費,容量為inf的邊。

跑一邊最小費用可行流後將費用取相反數即最大利潤。

#include 

#include

#include

#include

#define n 505

#define inf 1000000000

using namespace std;

struct edge e[n*n];

struct quest

}a[n];

int n,m,k,s,t,tim_lim,top=-1,t[n][n],c[n][n],fir[n];

void add_edge(int from,int to,int cap,int cost)

bool spfa(int& flow,int& cost)

}if(d[t]>=0) return false;

flow+=f[t];

cost+=d[t]*f[t];

intx=t;

while(x!=s)

return true;

}int costflow()

int main()

add_edge(s,s+1,k,0);

printf("%d\n",-costflow());

return

0;}

2696 航班安排 費用流

先讓我重新說一下題意qwq。有n 個機場,機場兩兩之間需要的最短時間是fi j,花費的費用是乙個固定值ci j,有 m 個請求,在 s時刻從 a 機場起飛,在恰好 t時刻到達 b 機場,可以淨獲利cc 問最大獲利。也就是說對於路線i j 你可以為了恰好到達而多飛一會兒。資料保證給出的請求是合法的,即...

2696 航班安排 費用流

首先我的吐槽一下這題意描述。出題人的語文水平肯定沒我這種語文大渣高 然後我們就直接複製某位不知名的fqk神犇的題解 說的這麼詳細我都不忍心不複製了qaq 建完圖直接跑最小費用最大流 include include include include include include include inc...

國家集訓隊 航班安排 最小費用最大流

對請求拆點建圖 對於乙個請求,如果 0 時刻可以從 0 機場到這裡,那麼 s 向它連邊,流量 infty 費用為 w 結束時間飛回 0 小於時間限制,則向著 t 連邊,費用為 w 兩兩枚舉所有請求,如果來得及就同理連邊 最後別忘了限制一下總流量 跑最小費用最大流即可 include using na...