HDU 4862 JUMP 最小費用最大流

2022-05-22 14:57:13 字數 1391 閱讀 7524

2014 多校的b題,由於我不怎麼搞圖論,當時碰到這個題目,我怎麼想都沒往網路流方面弄,不過網路流真的是個好東西,對於狀態多變,無法用動規或者資料結構來很好表示的時候,非常有用

這個題目要求每個點一定要訪問到,並且每次訪問的是沒訪問過的點,跳躍的方向為向右或者向下。

建圖的時候,分成二分圖,從乙個超級源點向x部分建cap為1 cost為0的點,對所以可到達的點從x到y建cap為1,cost根據題目算出來,不過要算負值,因為我們要求得實際是最大費用,最後對結果求相反數即可。所有y部分的點對超級匯點t建cap為1,cost為0的點。

但是這樣還是沒滿足只能走k次的條件,所以得額外建乙個點,從s到該點建cap為k,cost為0的點,再用這個點對y部分所有點建cap為1,cost為0的點,因為每次從x部流到y部最終流到t的點,都是不包括起始點的,用這個額外點向y部分**最多k次(不一定要k個)的起始點量即可

最後求得一定要流量為 n*m才算走通,此外,cost的相反數即為所求最大費用

用的是大白書上的最小費用最大模板,複雜度應該是n*m*某個係數

#include #include #include #include #include #include using namespace std;

const int maxn = 310;

struct edge

;struct mcmf

void add(int from,int to,int cap,int cost)

);edges.push_back((edge));

m=edges.size();

g[from].push_back(m-2);

g[to].push_back(m-1);

}} tf;

char mat[15][15];

int n,m,k;

int id[15][15];

int s,t;

bool bellman(int s,int t,int &flow,int &cost)}}

}if (tf.d[t]>=(1<<30)) return false;

flow+=tf.a[t];

cost+=tf.d[t];

int u=t;

while (u!=s)

return true;

}int mincost()

int main()

for (int j=c+1;j<=m;j++)}}

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

}tf.add(s,2*n*m+1,k,0);

for (int i=n*m+1;i<=2*n*m;i++)

printf("case %d : %d\n",++kase,mincost());

}return 0;

}

hdu 4862 Jump 最小費用流

之前也是看的解題報告寫的,所以寫的不好。現在回頭看看,其實很簡單。這篇我只作為筆記使用 14多校賽第一場題解 include include include include include include include include using namespace std define ll i...

HDU4862 Jump(最大流量最大費用流)

題意 有n m的格仔,每乙個格仔包含乙個數字,0 9。你初始的能量為0,你可以玩k次,每乙個你可以選擇你現在的格仔的正下方或者正右方的任意乙個格仔跳,但必須是之前沒有跳過的格仔。每玩一次你都可以跳任意次。每跳一次,從 x1,y1 到 x2,y2 你將花費 x1 x2 y1 y2 1的能量,如果起止格...

HDU4862 Jump(放大邊權的費用流)

題目大概給乙個n m的格仔,每個格仔有乙個一位數字,格仔不能重複經過,最多進行這樣的k次行走 每一次選擇任意乙個格仔出發,可以從當前格仔走到下面或右邊格仔,花費能量是曼哈頓距離 1,而如果起點和終點格仔數字一樣那就能獲得那個數字的能量。問能不能走過所有的格仔,如果能算出 最大的最終能量。太弱了。官方...