LG2045 方格取數加強版 費用流

2022-03-20 02:34:14 字數 1136 閱讀 3448

lg2045

費用流。

套路拆點,把\((i,j)\)拆為兩個點,在這兩個點之間連邊:一條邊流量為\(1\),費用為\(a_\),另一條邊為流量為\(inf\),費用為\(0\)(表示聯通)。

然後在\((i,j)\)的出點向\((i+1,j)\),\((i,j+1)\)連邊,流量\(inf\),費用\(0\),表示聯通。

建立\(s,t\),分別於\((1,1),(n,n)\)相連,流量為\(k\),費用為\(0\),代表可以走\(k\)次。

跑費用最大流即可。

傳紙條本質是本題的特殊情況,即\(k=2\)的情況

#includeusing namespace std;

template void read(tp &x)

const int maxn=53;

const int maxm=1000000;

const int inf=0x3f3f3f3f;

int a[maxn][maxn],n,k;

int head[maxn*maxn*2],s,t;

int next[maxm],to[maxm],tot=1,w[maxm],cost[maxm];

void add(int x,int y,int z,int c)

int calc(int x,int y,int t)

bool vis[maxm];

int dis[maxm],pre[maxm],now[maxm];

bool spfa()

} return dis[t]!=0xcfcfcfcf;

}int mx,ans;

void upd()

}int main()

} s=n*n*2+1,t=s+1;

add(s,calc(1,1,1),k,0);add(calc(1,1,1),s,0,0);

add(calc(n,n,2),t,k,0);add(t,calc(n,n,2),0,0);

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

} while(spfa())

upd();

printf("%d\n",ans);

return 0;

}

洛谷P2045 方格取數加強版 費用流

題目鏈結 這題能想到費用流就不難做了 從s向 1,1 連費用為0,流量為k的邊 從 n,n 向t連費用為0,流量為k的邊 對於每個點我們可以拆點限流,同時為了保證每個點只被經過一次,需要拆點。對於拆出來的每個點,在其中連兩條邊,一條為費用為點權,流量為1,另一條費用為0,流量為inf 相鄰兩個點之間...

P2405 方格取數問題加強版 費用流

考慮如何建圖。還是老樣子先拆點,然後把每兩個點之間連線兩條邊,一條流量為1,費用為 點權,處理是否走這個點。一條流量無限,沒有費用,因為哪怕乙個點選過了,它的地方還是可以重複走過去的。然後把經由乙個點能到達的另乙個點連邊。因為要走k次,所以由s向1號點入點連邊,n號點出點向t連邊,流量為k,費用為0...

luogu P2045 方格取數加強版

題目傳送門 題意 有乙個n n的矩陣,每乙個點都有對應的權值,現在你可以走k次,求你能獲得的最大價值。注意 每個點選完之後權值變為0。思路 最大費用最大流啊。1.因為只能選k次,所以開乙個超級源點和超級匯點,分別連向 1,1 和 n,n 流量為k。2.因為每個點的權值只能選一次,所以拆點。1 每乙個...