HDU 4862 Jump (最小K路徑覆蓋)
HDU 4862 Jump
題意:給定一個N*M的矩陣,矩陣裡面為0~9的數字。現在規定從一個點可以跳到它正下方和正右方的點,花費的費用為曼哈頓距離 - 1。如果在跳的過程中,兩個點的數字相同,那麼將得到該點的數字。規定可以從任意點開始跳,每個點只能經過1次。最多可以選擇K個點來作為起點進行跳躍。問能否經過所有的點,如果可以,那麼花費的費用是多少。
思路:
如果是最小路徑覆蓋,那麼很容易構造圖。但這裡還有個限制是要在K次走完所有的點。
最小K路徑覆蓋的模型,用費用流或者KM算法解決,構造二部圖,X部有N*M個節點,源點向X部每個節點連一條邊,流量1,費用0,Y部有N*M個節點,每個節點向匯點連一條邊,流量1,費用0,如果X部的節點x可以在一步之內到達Y部的節點y,那麼就連邊x->y,費用為從x格子到y格子的花費能量減去得到的能量,流量1,再在X部增加一個新的節點,表示可以從任意節點出發K次,源點向其連邊,費用0,流量K,這個點向Y部每個點連邊,費用0,流量1,最後用這個圖跑最小費用最大流,如果滿流就是存在解,反之不存在,最小費用的相反數就是可以獲得的最大能量。
代碼:
/*
ID: [email protected]
PROG:
LANG: C++
*/
#include