題目傳送門:
題意:
有乙個n*n的矩陣,每乙個點都有對應的權值,現在你可以走k次,求你能獲得的最大價值。注意:每個點選完之後權值變為0。
思路:
最大費用最大流啊。
1.因為只能選k次,所以開乙個超級源點和超級匯點,分別連向(1,1)和(n,n),流量為k。
2.因為每個點的權值只能選一次,所以拆點。
[1]每乙個點x向x'建一條流量為1,費用為點x的價值的邊(因為每乙個點的權值只能被選一次);
[2]每乙個點x向x'建一條流量為無限大,費用為0的邊(因為乙個點可以走多次);
3.每乙個點向它四周的點連一條流量為無限大,費用為0的邊(因為乙個點可以走到另乙個點走多次)。
最後再跑最大費用最大流即可。
**:
#include#include#include#include#include#define inf 2147483647
using namespace std;
queuef;
int n,k,len=-1,st,ed;
struct node a[100010];
int last[5010],dis[5010],pre[5010],pos[5010],p[5010];
bool bz[5010];
void ins(int x,int y,int c,int d)
bool spfa()
}} f.pop();
} return dis[ed]<1061109567;
}int flow()
} return ans;
}int main()
printf("%d",-flow());
}
luogu P1004 方格取數
設有n n的方格圖 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放 人數字0。如下圖所示 見樣例 a 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 0 0 15 0 ...
P2045 方格取數加強版
給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求k次所達到的方格的數的和最大 輸入格式 第一行兩個數n,k 1 n 50,0 k 10 接下來n...
LGP2045 方格取數加強版
題目 還糾結了一下是費用流還是最小割 最終還是決定讓最小割去死吧 我們的問題就是讓乙個點的點權只被計算一次 考慮拆點 將所有點拆成入點和出點,入點向出點連流量為 1 的邊 每乙個出點往下連能到達的點,向入點連費用為該點點權容量為 0 的邊,向出點連費用為 0 容量為 k 1 的邊 這樣我們就能保證乙...