【分層圖】
【分層圖是什么】
分層圖,顧名思義
就是分很多層的圖
也就是類似二維數組
不再是一個單一的平面
而是一個立體化的東西
不只有長寬,也有了自己的厚度
即為層數
【分層圖可以用來干什么呢】
有的題目中會說到
讓你免費建立k條邊
這個時候就可以用到分層圖了
建立 多層 相同或相似的 圖, 並在圖與圖之間進行連邊
可以實現 兩種性質的圖 之間的 轉移,
或是 圖與圖 之間 有限制的轉移
不過 建多層圖時間空間 消耗都巨大,
因此適用的 數據范圍 一般較小
多層的圖,不同的狀態
這里面之間可以轉移
這里的狀態有點類似動態規划
表示層數和情況狀態
假設免費建立k條邊
所以就可以有k層圖表示已經免費建立了1條邊到免費建立了k條邊
如果現在你是出於第i個點,你已經建立了j條免費的邊
你的下一個點是acioi,不過到acioi需要花費很多
所以就要建立一條免費的邊
這個時候就連接到第j+1層的acioi這點了
第j+1層acioi的點這個狀態用來j+1條邊
比轉移之前多用了一條邊
也就是i到acioi的這條邊
這就是分層圖了
【分層圖的實現】
在連接每兩個點的同時
將復制出來的另外k個圖上對應的兩個點連接起來
也將i圖和j圖上的對應的點連接起來
也就是讓這條邊權值為零的情況
核心代碼
for(register int i = 1;i <= m;++ i)
{
int x,y,z;
cin >> x >> y >> z;
add(x,y,z),add(y,x,z);
for(register int j = 1;j <= k;++ j)
{
add(j * n + x,j * n + y,z);//將其他圖對應的邊連接起來
add(j * n + y,j * n + x,z);
add((j - 1) * n + x,j * n + y,0);//兩張圖的連接點
add((j - 1) * n + y,j * n + x,0);
}
}
【例題】
P2939 [USACO09FEB]改造路Revamping Trails
分層圖模板題
題解戳這里
P4822 [BJWC2012]凍結
分層圖模板提
題解戳這里
P4568 [JLOI2011]飛行路線
分層圖模板提
題解戳這里
綜上所述:
分層圖開空間需要好好斟酌一下