HIT2715 Matrix3(最小費用最大流)

2022-05-02 19:00:07 字數 1433 閱讀 4141

題目大概說有乙個n×n的矩陣,每個格仔都有權值和高度,在這個矩陣中進行最多k次旅行,每次旅行能從當前格仔走到相鄰且高度更小的格仔,走到格仔邊界就能出去完成這次旅行。每走到乙個格仔就累加格仔的權值然後把該格仔的權值設定成0。問能獲得的最大權和。

很容易建容量網路。。主要是每個點拆成兩個點,中間的邊再拆成兩條,一條容量1費用-該邊權值的邊,另一條容量inf費用0的邊。。

另外題目要求得是最多k次的旅行,實際上越多顯然越好,所以最大流是沒問題的。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define inf (1<<30)

7#define maxn 55*55*2

8#define maxm 55*55*2*55*55*4

9struct

edgeedge[maxm];

12int

vs,vt,nv,ne,head[maxn];

13void addedge(int u,int v,int cap,int

cost)

19int

d[maxn],pre[maxn];

20bool

vis[maxn];

21bool

spfa()

25 d[vs]=0; vis[vs]=1

;26 queueque;

27que.push(vs);

28while(!que.empty())39}

40}41 vis[u]=0;42

}43return d[vt]!=inf;44}

45int

mcmf()

52for(int u=vt; u!=vs; u=edge[pre[u]].u)

57 res+=cost;58}

59return

res;60}

61int val[55][55],height[55][55

];62

int dx=;

63int dy=;

64int

main()

72for(int i=0; ii)

75int s=n*n*2

;76 vs=n*n*2+1; vt=vs+1; nv=vt+1; ne=0

;77 memset(head,-1,sizeof

(head));

78 addedge(vs,s,k,0

);79

for(int i=0; ii)90}

91}92 printf("

%d\n

",-mcmf());93}

94return0;

95 }

hoj2715 最小費用最大流 Matrix3

跟方格取數有點類似,只是有了高度的限制。建模方法 1 將每個格仔i拆成兩個點i i 加邊 i i 1,vi 保證單元內的寶物只能取一次。2 加邊 i i inf,0 s,i k,0 保證一開始可以從任意高度出發。注意源點s到i 的容量不能為inf 3 對相鄰的四個格仔j,若hi hj則加邊 i j ...

mysql最小費用最大流問題 最小費用最大流問題

複雜網路中,單源單點的最小費用最大流演算法 mcmf 應用廣泛。在實際網路問題中,不僅考慮從 vs到 vt的流量最大,還要考慮可行流在網路傳送過程中的費用問題,這就是網路的最小費用最大流問題。最小費用最大流問題的一般提法 已知容量網路 d v a c 每條弧 vi,vj 除了已給出容量 cij 外,...

mysql最小費用最大流問題 最小費用最大流問題

最小費用最大流就是在原來求最大流的基礎上,假設每條邊還有乙個單位流量所需要的費用,因為最小費用的出現,原本的平行邊變得有意義,並且允許反向增廣,基本上就是將原本bfs改為進行一次bellmanford演算法尋找最短路徑,只要初始流是該流量下的最小費用可行流,每次增廣後的新流都是新流量下的最小費用流。...