給定乙個由 nn 行數字組成的數字梯形如下圖所示。
梯形的第一行有 mm 個數字。從梯形的頂部的 mm 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。
分別遵守以下規則:
從梯形的頂至底的 mm 條路徑互不相交;
從梯形的頂至底的 mm 條路徑僅在數字結點處相交;
從梯形的頂至底的 mm 條路徑允許在數字結點相交或邊相交。
輸入格式:
第 11 行中有 22 個正整數 mm 和 nn,分別表示數字梯形的第一行有 mm 個數字,共有 nn 行。接下來的 nn 行是數字梯形中各行的數字。
第 11 行有 mm 個數字,第 22 行有 m+1m+1 個數字,以此類推。
輸出格式:
將按照規則 11,規則 22,和規則 33 計算出的最大數字總和並輸出,每行乙個最大總和。
輸入樣例#1: 複製
2 5輸出樣例#1: 複製2 33 4 5
9 10 9 1
1 1 10 1 1
1 1 10 12 1 1
667577
首先宣告這是乙個比較簡單的題目,建圖什麼的也很容易想,不過我就出現了很多莫名其妙的bug,浪費了很多時間。
有乙個bug就是我的第乙個out的拆點改成了500然後就錯了,這個我現在還是沒有明白為什麼,但是我覺得呢,這個可能有內部我沒有考慮到的原因,所以以後要寫的規範一點,不要想當然吧。
#include #include#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace
std;
typedef
long
long
ll;const
int inf = 0x3f3f3f3f
;const
int maxn = 2e5+10
;struct
edge
};vector
e;vector
g[maxn];
int a[maxn];//
找增廣路每個點的水流量
int p[maxn];//
每次找增廣路反向記錄路徑
int d[maxn];//
spfa演算法的最短路
int inq[maxn];//
spfa演算法是否在佇列中
ints, t, exa[maxn];
void
init()
void add(int u, int v, int c, int
cost)
bool bellman(int s, int t, int& flow, int &cost)
//bellman 演算法入隊
} }
}//printf("a=%d d=%d\n", a[t], d[t]);
if (d[t] < 0)return
false;//
找不到增廣路
flow += a[t];//
最大流的值,此函式引用flow這個值,最後可以直接求出flow
cost += d[t] * a[t];//
距離乘上到達匯點的流量就是費用
//printf("cost=%lld\n", cost);
for (int u = t; u != s; u = e[p[u]].u)//
逆向存邊
return
true;}
int maxflow(int s, int t, int &cost)
int sum[50],cas=1
;int
n, m;
void
out1()
len++;
}for (int i = 1; i <= m + n - 1; i++) add(sum[m - 1] + i + cas, t, 1, 0
);
int cost = 0
;
int ans =maxflow(s, t, cost);
printf(
"%d\n
", cost);
}void
out2()
len++;
}for (int i = 1; i <= m + n - 1; i++) add(sum[m - 1] + i, t, inf, 0
);
int cost = 0
;
int ans =maxflow(s, t, cost);
printf(
"%d\n
", cost);
return;}
void
out3()
len++;
}for (int i = 1; i <= m + n - 1; i++) add(sum[m - 1] + i, t, inf, 0
);
int cost = 0
;
int ans =maxflow(s, t, cost);
printf(
"%d\n
", cost);
return;}
intmain()
len++;
}sum[
0] = 0
;
for(int i=1;i<=m;i++) sum[i] = sum[i - 1] + n + i - 1
; out1();
out2();
out3();
return0;
}
洛谷P4013 數字梯形問題(費用流)
傳送門 兩個感受 碼量感人 大佬nb 規則一 m 條路徑都不相交,那麼每乙個點只能經過一次,那麼考慮拆點,把每乙個點拆成 a 和 b 然後兩點之間連一條容量 1 費用該點本身數值的邊,表明這個點只能被選一次,然後每乙個點的 b 向它能到達的點的 a 連邊,表明能從這個點到另乙個點,容量隨意,費用 0...
洛谷P4013數字梯形問題 網路流24題
題目 最大費用最大流裸題 注意 在第二種情況中,底層所有點連向匯點的邊容量應該為inf,因為可以有多條路徑結束在同乙個點。為這個調了半天.如下 include include include include using namespace std queue q intconst maxn 1605...
luogu P4013 數字梯形問題
三倍經驗,三個條件,分別對應了常見的3種模型,第一種是限制每個點只能一次且無交點,我們可以把這個點拆成乙個出點乙個入點,capacity為1,這樣就限制了只選擇一次,第二種是可以有交點,但不能有交邊,那我們就不需要拆點,限制每條capacity都為1就可以了,第三種直接連,沒有限制 includeu...