題目大意:傳k遍紙條每個點拆成入和出,入向出連一條容量為1,費用為該點權值的邊(表示選這個點,只能走一次)
再連一條容量為inf,費用0的邊(選過就不再有貢獻)
每個點的出向右和下的入連一條容量為inf費用為0的邊
超級源連點(1,1)的入一條容量為k,費用0的邊(傳k遍),點(n,m)的出連向超級匯,容量inf,費用0
跑最大費用流
**如下:
#include
#include
#include
#include
#define n 50020
#define inf 2147483647
using
namespace
std;
const
int s=50001;
const
int t=50002;
inline
int read()
queue
q;int n,k,x,cost,top=1;
int d[n],fir[n];
bool b[n];
struct edge
}nex[250005];
inline
int getnum(int x,int y)
inline
bool spfa()
}return d[t]!=-inf;
}int dfs(int x,int v)
b[x]=true;
int tmp=0;
for(int i=fir[x];i;i=nex[i].nex)
if(!b[nex[i].to] && d[nex[i].to]==d[x]+nex[i].v && nex[i].k)
if(!tmp) d[x]=-inf;
return tmp;
}inline
void dinic()
inline
void add(int x,int y,int k,int v)
int main()
if(j+1
<=n)
}add(s,getnum(1,1),k,0);add(getnum(1,1),s,0,0);
add(getnum(n,n)+n*n,t,inf,0);add(t,getnum(n,n)+n*n,0,0);
dinic();
printf("%d",cost);
return
0;}
codevs 1227 方格取數2
網路流 拆點 好像hdu上有類似的題。那時我還是用pascal寫的 算是裸題吧。然而我本不會費用流 看了下黃學長的 說下自己的理解 黃學長只貼了 把每乙個點拆成兩個點,乙個是流進的,乙個是流出的 然後建邊。這兩個點之間有這幾類邊 由流入點指向流出點,流量為1,費用為map i,j 由流出點指向流入點...
code vs 1227 方格取數 2
時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解 檢視執行結果 給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要...
codevs1227 方格取數 2
題目鏈結 n n的方格,每個格仔中有乙個數,尋找從 1,1 走到 n,n 的k條路徑,使得取到的數的和最大。經典的費用流應用吧。額外新增源點s和匯點t,分別與 1,1 和 n,n 連邊。把棋盤中每個點拆成兩個,連兩條弧。其中一條容量為1,費用為該點的數字大小 另一條容量為inf,費用為0。這就表示乙...