網路流二十四題之星際轉移問題

2021-08-18 08:18:30 字數 1801 閱讀 3361

這道題的建模是按照天數建模的分層模型,然後列舉需要多少天,需要對標號進行合理的設計。

1.每一天的地球,月球分別向源點,匯點連一條邊,容量inf

2.對於n個空間站,向他的下一天連一條邊,容量無限

.3.如果有一天飛船在前一天在i,這一天在j那麼將這兩個點連線在一起。

然後每天判斷是否滿流

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 100010;//點數的最大值

const

int maxm = 400010;//邊數的最大值

const

int inf = 0x3f3f3f3f;

struct edge

edge[maxm]; //注意是maxm

int tol;

int head[maxn];

int gap[maxn],dep[maxn],cur[maxn];

void init()

void addedge(int u,int v,int w,int rw = 0)

int q[maxn];

void bfs(int start,int end)

}}int s[maxn];

int sap(int start,int end,int n)

for(int i = 0; i < top; i++)

ans += min;

top = inser;

u = edge[s[top]^1].to;

continue;

}bool flag = false;

int v;

for(int i = cur[u]; i != -1; i = edge[i].next)

}if(flag)

int min = n;

for(int i = head[u]; i != -1; i = edge[i].next)

if(edge[i].cap - edge[i].flow && dep[edge[i].to] < min)

gap[dep[u]]--;

if(!gap[dep[u]])

return ans;

dep[u] = min + 1;

gap[dep[u]]++;

if(u != start)

u = edge[s[--top]^1].to;

}return ans;

}void print_all()

}int a[1001][1001];

int h[1001];

int len[1001];

int main()

}int s = 0,t = 9999;

for(int time = 0; time <= 500; time ++)

for(int i = 1; i<=n; i++)

}int ans = sap(s,t,2000);

//print_all();

//printf("%d\n\n",ans);

//puts("");

if(ans >= k)

}return0;}

/*2 2 1

1 3 0 1 2

1 3 1 2 -1

*/

網路流24題之星際轉移問題

一開始以為跑費用流,後來看了題解才知道可以按天建圖。1.從源點向每一天的地球鏈結一條inf 2.從每一天的月亮向匯點鏈結一條inf 4.針對每一艘飛船,獲取其上一天的位置,再獲取這一天的位置,在這兩個點之間連一條容量為飛船滿載人數的流 每次新加一天然後跑到最大流超過k即可 至於無解的情況只要當ans...

網路流二十四題

開始了我的網路流 24 題之旅,寫在一起到時候方便一起複習哦。其實這並不是真的二十四題,有一些過於水的我就不寫上來了。然後有的 太水了就不寫了。感覺這些題目還是比較基礎的,方法卻值得借鑑!剩餘題目 航空路線問題 火星探險問題以下 題目描述 點此看題 解法 你發現時間是最大的障礙,因為對於不同的時間飛...

網路流二十四題之分配問題

沒想到codevs上的資料和我本地的資料是一樣的 這下不用寫多餘的 了 這道題和上一道題一樣水,按照提議寫成二分圖就行。1.源點向每個人連一條邊,容量1,費用0,每個任務向匯點連一條邊,容量1,費用0 2.每個人向每個任務連一條邊,容量1,費用為cij 跑兩次費用流就行 include includ...