luogu2754 星際轉移問題 網路流

2022-06-30 13:39:15 字數 1794 閱讀 5668

題目大意:地球與月球間有可容納無限人的太空站,還有在太空站與星球間按週期行駛的、有固定容量的太空船,每一艘太空船從乙個太空站駛往任一太空站耗時均為 1。地球上有一定數量的人,問所有人到月球最少需要多少天。

最大流:把人群看作流。

分層:人們的最優選擇會受到其位於哪一天的影響,因此我們關於時間將整個圖分層。估計一下最多能用多少天,就分多少層。人們在太空站內可以呆著,因此每天的太空站要向下一天的太空站連容量∞費用1邊。太空船運人,因此太空船前一站向下一天的後一站連容量∞費用1邊。人類量固定,從s點向第一天的地球連容量為人數費用0邊。任意時刻到達月球均可,從每天的月球向t連容量為無窮費用0邊。

最小費用:這裡的mcmf有些不同:費用不是單位費用,而是絕對費用;最小費用是每次spfa所得路徑的總費用的最大值,而不是和(否則同一天兩群人坐船就被算成了兩天)。

#include #include 

#include

#include

#include

using

namespace

std;

//#define test

#define loop(i,n) for(int i=1; i<=n; i++)

#define s(station, day) station + (day - 1) * totstation

#define r(x, t) (x - 1) % (t) + 1

#define inf 0x3f3f3f3f

const

int max_ship = 25, max_stop = 30, max_day = 400, max_node = max_stop *max_day;

inttotstation, totship, tothuman;

intcap[max_ship], route[max_ship][max_stop], stopcnt[max_stop];

struct

mcmf

;

struct

edge

;node _nodes[max_node];

vector

_edges;

int _vcount = 0, _ecount = 0

; node *start, *sink;

inttotflow, totcost;

void init(int n, int sid, int

tid)

edge *newedge()

}edge* addedge(node *from, node *to, int cap, int

cost)

void build(int uid, int vid, int cap, int

cost)

bool

spfa()

start->dist = 0

; q.push(start);

while (!q.empty())}}

}return sink->prev;

}void

proceed()

totcost =max(totcost, curcost);}}

}g;int proceed(int

totday)

intmain()

}printf(

"%d\n

", proceed(max_day));

return0;

}

view code

注意:1.要讓包括星球在內的太空站的編號從1開始,否則容易暈。

2.最大值不要卡著邊設。

星際轉移問題

由於人類對自然資源的消耗,人們意識到大約在 2300 年之後,地球就不能再居住了。於是在月球上建立了新的綠地,以便在需要時移民。令人意想不到的是,2177 年冬由於未知的原因,地球環境發生了連鎖崩潰,人類必須在最短的時間內遷往月球。現有 n 個太空站位於地球與月球之間,且有 m 艘公共運輸太空船在其...

星際轉移問題

s向地球連k的邊,每天每個地方由上一天連inf邊,每天月亮向t連邊 列舉天數獲取每天飛船的位置,由上一天的位置向這一天連滿載的邊 跑到人都送完位置,在合適的時候 玄學 break輸出無解 include include include include include define ll long l...

網路流24題 星際轉移問題

這個問題的難點在於如何表示時間的流逝很容易 想到源點 是地球,然後中間 一串的空 間站,最 後連向匯 點月 球很容易想到源點是地球,然後中間一串的空間站,最後連向匯點月球 很容易想到源 點是地球 然後中 間一串的 空間站,最後連向 匯點月球空間 站間各自 連邊,流 量是飛船 的容 量空間站間各自連邊...