題目大概說有乙個n×n的矩陣,每個格仔都有權值和高度,在這個矩陣中進行最多k次旅行,每次旅行能從當前格仔走到相鄰且高度更小的格仔,走到格仔邊界就能出去完成這次旅行。每走到乙個格仔就累加格仔的權值然後把該格仔的權值設定成0。問能獲得的最大權和。
很容易建容量網路。。主要是每個點拆成兩個點,中間的邊再拆成兩條,一條容量1費用-該邊權值的邊,另一條容量inf費用0的邊。。
另外題目要求得是最多k次的旅行,實際上越多顯然越好,所以最大流是沒問題的。
1 #include2 #include3 #include4 #include5using
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演算法尋找最短路徑,只要初始流是該流量下的最小費用可行流,每次增廣後的新流都是新流量下的最小費用流。...