日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网络流24题23. 火星探险问题

發(fā)布時(shí)間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网络流24题23. 火星探险问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

火星探險(xiǎn)問題

Description

火星探險(xiǎn)隊(duì)的登陸艙將在火星表面著陸,登陸艙內(nèi)有多部障礙物探測車。登陸艙著陸后,探測車將離開登陸艙向先期到達(dá)的傳送器方向移動(dòng)。探測車在移動(dòng)中還必須采集巖石標(biāo)本。每一塊巖石標(biāo)本由最先遇到它的探測車完成采集。每塊巖石標(biāo)本只能被采集一次。巖石標(biāo)本被采集后,其他探測車可以從原來巖石標(biāo)本所在處通過。探測車不能通過有障礙的地面。本題限定探測車只能從登陸處沿著向南或向東的方向朝傳送器移動(dòng),而且多個(gè)探測車可以在同一時(shí)間占據(jù)同一位置。如果某個(gè)探測車在到達(dá)傳送器以前不能繼續(xù)前進(jìn),則該車所采集的巖石標(biāo)本將全部損失。
用一個(gè) P×Q 網(wǎng)格表示登陸艙與傳送器之間的位置。登陸艙的位置在(X 1 ,Y 1 )處,傳送器的位置在(X P ,Y Q )處。
給定每個(gè)位置的狀態(tài),計(jì)算探測車的最優(yōu)移動(dòng)方案,使到達(dá)傳送器的探測車的數(shù)量最多,而且探測車采集到的巖石標(biāo)本的數(shù)量最多。

Input

第 1 行為探測車數(shù),第 2 行為 P 的值,第 3 行為 Q 的值。接下來的 Q 行是表示登陸艙與傳送器之間的位置狀態(tài)的 P×Q 網(wǎng)格。用 3 個(gè)數(shù)字表示火星表面位置的狀態(tài):0 表示平坦無障礙,1 表示障礙,2 表示石塊。

Output

輸出每個(gè)探測車向傳送器移動(dòng)的序列。
每行包含探測車號(hào)和一個(gè)移動(dòng)方向,0 表示向南移動(dòng),1 表示向東移動(dòng)。

題解

還是由于spj問題,將輸出進(jìn)行改動(dòng),輸出能到達(dá)傳送器的車的數(shù)量以及能采集到的巖石的數(shù)量。
建立附加源S和附加匯T,建圖:
每個(gè)位置點(diǎn)拆成兩個(gè),u.a和u.b。
1.S向(1,1).a連一條容量為車數(shù),費(fèi)用為0的邊。
2.(P,Q).b向T連一條容量為車數(shù),費(fèi)用為0的邊。
3.不是障礙的點(diǎn)u,u.a向u.b連一條容量為無窮大,費(fèi)用為0的邊。
4.是石塊的點(diǎn)v,v.a向v.b連一條容量為1,費(fèi)用為1的邊。
5.u東方或南方的點(diǎn)是v,u.b向v.a連一條容量為無窮大,費(fèi)用為0的邊。
輸出最大流和最大費(fèi)用即可。
每條ST滿流路徑都是一個(gè)探測車的路徑。

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std;const int N = 5000 + 10, M = 1000000 + 10, K = 40, inf = 0x3f3f3f3f; struct Edge{int fr, to, cap, flow, cost; }edg[M]; int hd[N], nxt[M], tot; int s, t; int d[N], a[N], p[N], q[N], inq[N]; int n, P, Q; int mp[K][K];void insert(int u, int v, int w, int x){edg[tot].fr = u, edg[tot].to = v, edg[tot].cap = w, edg[tot].cost = x;nxt[tot] = hd[u]; hd[u] = tot;tot++;edg[tot].fr = v, edg[tot].to = u, edg[tot].cost = -x;nxt[tot] = hd[v]; hd[v] = tot;tot++; } bool spfa(int &fl, int &cst){for(int i = s; i <= t; i++) d[i] = -inf;d[s] = 0; a[s] = inf; p[s] = 0;int head = 0, tail = 1;q[0] = s; inq[s] = 1;while(head != tail){int u = q[head++]; if(head == 5001) head = 0;inq[u] = 0;for(int i = hd[u]; i >= 0; i = nxt[i]){Edge &e = edg[i];if(d[e.to] < d[u] + e.cost && e.cap > e.flow){d[e.to] = d[u] + e.cost;p[e.to] = i;a[e.to] = min(a[u], e.cap - e.flow);if(!inq[e.to]){q[tail++] = e.to; if(tail == 5001) tail = 0;inq[e.to] = 1;}}}}if(d[t] == -inf) return false;fl += a[t];cst += a[t] * d[t];int u = t;while(u != s){edg[p[u]].flow += a[t];edg[p[u]^1].flow -= a[t];u = edg[p[u]].fr;}return true; } void init(){scanf("%d%d%d", &n, &Q, &P);for(int i = 1; i <= P; i++)for(int j = 1; j <= Q; j++)scanf("%d", &mp[i][j]); } int get(int x, int y, int z){return (x - 1) * Q + y + z * (P * Q); } void build(){memset(hd, -1, sizeof(hd));s = 0, t = P * Q * 2 + 1;for(int i = 1; i <= P; i++)for(int j = 1; j <= Q; j++){if(mp[i][j] != 1) insert(get(i, j, 0), get(i, j, 1), inf, 0);if(mp[i][j] == 2) insert(get(i, j, 0), get(i, j, 1), 1, 1);if(i < P) insert(get(i, j, 1), get(i+1, j, 0), inf, 0);if(j < Q) insert(get(i, j, 1), get(i, j+1, 0), inf, 0);}insert(s, get(1, 1, 0), n, 0);insert(get(P, Q, 1), t, n, 0); } void work(){build();int flow = 0, cost = 0;while(spfa(flow, cost));printf("%d %d\n", flow, cost); } int main(){freopen("prog823.in", "r", stdin);freopen("prog823.out", "w", stdout);init();work();return 0; }

總結(jié)

以上是生活随笔為你收集整理的网络流24题23. 火星探险问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。