codevs1227 方格取數 2

2022-05-21 13:54:08 字數 1040 閱讀 9716

(題目鏈結)

n*n的方格,每個格仔中有乙個數,尋找從(1,1)走到(n,n)的k條路徑,使得取到的數的和最大。

經典的費用流應用吧。

額外新增源點s和匯點t,分別與(1,1)和(n,n)連邊。把棋盤中每個點拆成兩個,連兩條弧。其中一條容量為1,費用為該點的數字大小;另一條容量為inf,費用為0。這就表示乙個點的數只能取一次,然後跑最大費用最大流即可。

陣列開小。。

// codevs1227

#include#include#include#include#include#include#include#define ll long long

#define inf 2147483640

#define pi acos(-1.0)

#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);

using namespace std;

const int maxn=100010;

struct edge e[maxn<<1];

int head[maxn],dis[maxn],vis[maxn],f[maxn],p[maxn];

int cnt=1,n,m,es,et,k;

void link(int u,int v,int c,int w) ;head[u]=cnt;

e[++cnt]=(edge);head[v]=cnt;

}int spfa()

} if (dis[et]==-1) return 0;

for (int i=p[et];i;i=p[e[i].from]) e[i].w-=f[et],e[i^1].w+=f[et];

return f[et]*dis[et];

}int ek()

int main()

link(es,1,0,inf);link(n*n+n*n+2,et,0,inf);

printf("%d",ek());

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,費用流

傳送門 寫在前面 努力提公升寫網路流的能力 思路 建圖和蚯蚓很相似,不過這裡 i,j 拆出的兩個點x,y之間的邊有花費,實際點 i,j 與 i 1,j i,j 與 i,j 1 之間的連邊要流量inf費用為0,而且拆出的兩個點都要向 i 1,j i,j 1 的x點連邊,因為可能我們之前已經去過 i,j...