問題描述
mf城建立在一片高原上。由於城市唯一的水源是位於河谷地帶的湖中,人們在坡地上修築了一片網格狀的抽水水管,以將湖水抽入城市。如下圖所示:
這片管網由 n 行 m 列節點(紅色,圖中 n = 5,m = 6),橫向管道(紫色)和縱向管道(橙色)構成。
行和列分別用 1 到 n 的整數和 1 到 m 的整數表示。第 1 行的任何乙個節點均可以抽取湖水,湖水到達第 n 行的任何乙個節點即算作引入了城市。
除第一行和最後一行外,橫向相鄰或縱向相鄰的兩個節點之間一定有一段管道,每一段管道都有各自的最大的抽水速率,並需要根據情況選擇抽水還是放水。對於縱向的管道(橙色),允許從上方向下方抽水或從下方向上方放水;如果從圖中的上方向下方抽水,那麼單位時間內能通過的水量不能超過管道的最大速率;如果從下方向上方放水,因為下方海拔較高,因此可以允許有任意大的水量。對於橫向的管道(紫色),允許從左向右或從右向左抽水,不允許放水,兩種情況下單位時間流過的水量都不能超過管道的最大速率。
現在mf城市的水務負責人想知道,在已知每個管道單位時間容量的情況下,mf城每單位時間最多可以引入多少的湖水。
輸入格式
由於輸入規模較大,我們採用偽隨機生成的方式生成資料。
每組資料僅一行包含 6 個非負整數 n, m, a, b, q, x0。其中,n 和 m 如前文所述,表示管網的大小,保證 2 ≤ n, m ≤ 5000;保證 1 ≤ a, b, q, x0 ≤ 109。
a, b, q, x0 是資料生成的引數,我們用如下的方式定義乙個數列 :
xi+1 = ( axi + b) mod q, (i ≥ 0)
我們將數列的第 1 項到第 (n-1)m 項作為縱向管道的單位時間容量,其中 x(s-1)m+t 表示第 s 行第 t 列的節點到第 s+1 行第 t 列管道單位時間的容量;將數列的第 (n-1)m+1 項到第 (n-1)m+(n-2)(m-1) 項(即接下來的 (n-2)(m-1) 項)作為橫向管道的單位時間容量,其中 x(n-1)m+(s-2)(m-1)+t 表示第 s 行第 t 列的節點到第 s 行第 t+1 列管道單位時間的容量。
輸出格式
輸出一行乙個整數,表示mf城每單位時間可以引入的水量。
注意計算過程中有些引數可能超過32位整型表示的最大值,請注意使用64位整型儲存相應資料。
樣例輸入
3 3 10 3 19 7
樣例輸出
38樣例輸入
2 5 595829232 749238243 603779819 532737791
樣例輸出
1029036148
樣例輸入
5 2 634932890 335818535 550589587 977780683
樣例輸出
192923706
樣例輸入
5 5 695192542 779962396 647834146 157661239
樣例輸出
1449991168
時間限制:2.0s
記憶體限制:512.0mb
很容易看出這是乙個網路流最大流的模型,以湖為源點,城市為匯點按要求建圖即可,但有乙個問題,那就是資料規模,極限資料下m==5000,n==5000,這麼一來就相當於有2.5*1e7個點,並且邊數是點數的三四倍左右,這樣建圖肯定會mle,就算記憶體夠大,2s的時間限制也會導致程式tle,所以網路流是過不了這道題的所有資料的,經過仔細觀察後發現,這些圖點都是層次分明的,而且n行的點的水流的最大值與n-1行有關,貌似可以用dp?
博主首先嘗試了一下dinic,加了多路增廣及炸點優化依然只得了60分,後面的資料t掉了。先留個坑,去研究一下dp的做法,回來補上。
首先講幾個潛在的坑(或者說審題不仔細弄錯的地方)
1.橫向邊是無向邊,意味著正邊和反邊flow一樣。
2.縱向邊從上往下有限制,從下往上沒有限制。
然後是60分的網路流**:
#include
#include
#include
#define rep(i,x,n) for(ll i=x;i#define per(i,x,n) for(ll i=n-1;i>=x;i--)
#define nxt(x) x=((a*x)+b)%q
using
namespace
std;
//head
typedef
long
long ll;
const ll maxn=5e6,ha=1
<<30;
int n,m,num,head[maxn],flag[maxn],cur=0,t;
ll x,a,b,q;
struct edgeedge[6*maxn];
void addedge(ll q,ll w,ll x)
void addedge1(ll q,ll w,ll x)
void addedge2(ll q,ll w,ll x)
int bfs()
}return flag[t];
}ll dfs(ll fl,int num)
}if(!f)flag[num]=-2;
return f;
}ll maxflow()
return ret;
}int main()
rep(i,1,m+1)
rep(i,0,n-1)rep(j,1,m+1)
rep(i,1,n-1)rep(j,1,m)
cout
0;}
NOIP2010 引水入城
兩遍bfs floodfill,第一遍bfs可以判斷出最後是輸出0還是輸出1,第二遍bfs floodfill不懂 program flow const dx array 1.4 of 1.1 1,0,1,0 dy array 1.4 of 1.1 0,1,0,1 type atp record x...
VIJOS P1777引水入城
描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n行m列的矩形,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利...
NOIP2010 引水入城
4引水入城在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水...