題意:有n*m的格仔,每乙個格仔包含乙個數字,0-9。你初始的能量為0,你可以玩k次,每乙個你可以選擇你現在的格仔的正下方或者正右方的任意乙個格仔跳,但必須是之前沒有跳過的格仔。每玩一次你都可以跳任意次。每跳一次,從(x1, y1) 到 (x2, y2),你將花費|x1-x2|+|y1-y2|-1的能量,如果起止格仔的數字相同,你能獲得格仔裡數字的能量。
問你在把每乙個格仔都經過的基礎上,所能得到的最大能量。
每個格仔只能經過乙個,你可以跳少於k次。你的能量可以為負數。
>>之前做過成環覆蓋所有點的題,拆點建立二分圖,此題和那個題感覺有點像。
建圖的方法就是源點連所有x部,流量為1,權值為0,所有y部連匯點,流量是1,權值為0。
能夠從a點走到b點,就從a的x部到b的y部,權值就是花費。
然後在x部新增乙個點q,從源點連到q流量為k,權值為0的邊,q到y部每乙個點都連流量為1,權值為0的邊,來保證玩k次。
最後求乙個最大流量最大費用就好了。
>>建圖很巧妙,但是。。。不是很懂。。。。先記下方法了。。。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pk(x) printf("%d\n", x)
using
namespace
std;
#define pi acos(-1.0)
#define eps 1e-6
#define clr(x,c) memset(x,c,sizeof(x))
//#pragma comment(linker, "/stack:102400000,102400000")
typedef long
long
ll;#include
#include
#include
using
namespace
std;
const
int maxv = 410
;const
int inf = 1
<<30
;struct edge ;
vector
g[maxv];
int dist[maxv], prv[maxv], pre[maxv], in
[maxv];
queue
que;
void addedge(int
from, int to, int cap, int
cost) );
g[to].push_back((edge));
}int min_cost_max_flow(int s, int t, int
f) }}}
if (dist[t] == -inf) return -1
;
int d =f;
for (int v = t; v != s; v =prv[v])
f -=d;
res += d *dist[t];
for (int v = t; v != s; v =prv[v])
}return
res;
}int
n, m, k;
char str[15][15
];int id1(int x, int
y) int id2(int x, int
y) //
|x1-x2|+|y1-y2|-1
int cost(int x1, int y1, int x2, int
y2)
intmain()
int src = 0
;
int q = n*m*2+1
;
int sink = n*m*2+2
;
for (int i = src; i <= sink; ++i) g[i].clear();
addedge(src, q, k, 0);
for (int i = 0; i < n; ++i)
for (int k = j+1; k < m; ++k) }}
printf(
"case %d : %d\n
", ++cas, min_cost_max_flow(src, sink, n*m));
}return0;
}
HDU 4862 JUMP 最小費用最大流
2014 多校的b題,由於我不怎麼搞圖論,當時碰到這個題目,我怎麼想都沒往網路流方面弄,不過網路流真的是個好東西,對於狀態多變,無法用動規或者資料結構來很好表示的時候,非常有用 這個題目要求每個點一定要訪問到,並且每次訪問的是沒訪問過的點,跳躍的方向為向右或者向下。建圖的時候,分成二分圖,從乙個超級...
hdu 4862 Jump 最小費用流
之前也是看的解題報告寫的,所以寫的不好。現在回頭看看,其實很簡單。這篇我只作為筆記使用 14多校賽第一場題解 include include include include include include include include using namespace std define ll i...
HDU4862 Jump(放大邊權的費用流)
題目大概給乙個n m的格仔,每個格仔有乙個一位數字,格仔不能重複經過,最多進行這樣的k次行走 每一次選擇任意乙個格仔出發,可以從當前格仔走到下面或右邊格仔,花費能量是曼哈頓距離 1,而如果起點和終點格仔數字一樣那就能獲得那個數字的能量。問能不能走過所有的格仔,如果能算出 最大的最終能量。太弱了。官方...