1227 方格取數 2時間限制: 1 s
空間限制: 128000 kb
題目等級 :大師 master
檢視執行結果
題目描述 description
給出乙個n*n的矩陣,每一格有乙個非負整數aij,(aij <= 1000)現在從(1,1)出發,可以往右或者往下走,最後到達(n,n),每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求k次所達到的方格的數的和最大
輸入描述 input description
第一行兩個數n,k(1<=n<=50, 0<=k<=10)
接下來n行,每行n個數,分別表示矩陣的每個格仔的數
輸出描述 output description
乙個數,為最大和
樣例輸入 sample input
3 1
1 2 3
0 2 1
1 4 2
樣例輸出 sample output
11 資料範圍及提示 data size & hint
1<=n<=50, 0<=k<=10
分類標籤 tags
網路流 費用流 圖論
/*
拆點+費用流.
自己yy不對然後看的題解orz.
考慮兩個東西.
一是計算答案貢獻並保證貢獻只計算一次.
二是使圖連通.
通過一我們很容易想到拆點後建一條流量為1費用為格仔貢獻的邊.
通過二拆點後建一條流量為k-1費用為0的邊.
然後把(i,j)與(i-1,j)和(i,j-1)連線起來.
*/#include
#include
#include
#define maxn 10010
#define inf 1e9
using namespace std;
int n,k,ans,cut=1,tot,s,t,head[maxn],g[51][51],dis[maxn],b[maxn],fa[maxn];
struct datae[maxn*2];
queueq;
intread()
while(ch>='0'&&ch<='9') x=x
*10+ch-48,ch=getchar();
return
x*f;
}void add(int u,int v,int c,int f)
bool bfs(int t)}}
return dis[t]!=-inf;
}void mincost()
ans+=dis[t]*x;
}return ;
}int main()
mincost();
printf("%d",ans);
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。這就表示乙...