【清華集訓 2017】無限之環
費用流神題。
對於每乙個方格延伸出去的每一根水管,有且僅有乙個其他方格延伸出的水管與之相連,這樣就不會漏水。即:每根水管的容量為
1 1
,且必須滿流。
然而即使產生了最優情況,整個管網也不一定是一整個聯通塊,而可能被分成若干塊。因此,我們要對每個格點染色,相鄰的兩個格點,乙個連源點,乙個連匯點,就可以強制使每兩個相鄰的方格上都產生流量了。
旋轉所花的步數即是費用。將乙個方格拆成
5' role="presentation" style="position: relative;">5
5個點(上下左右中),中間點連上源or
o
r匯點,並根據水管情況向四周連容量
1 1
,費用0' role="presentation" style="position: relative;">0
0的邊。四周視作接觸點,與對應相鄰的另乙個接觸點連容量
1 1
,費用0' role="presentation" style="position: relative;">0
0的邊。接下來,對於每一種形狀的格仔,分類討論。
至此,構圖已經完成,接下來只要套上模版即可。
//「luogu4003」infinity loop
#include
#include
#include
#include
using
namespace
std;
#define c(k) k + (sum << 2)
#define u(k) k + turn * sum
#define r(k) k + ((turn + 1) & 3) * sum
#define d(k) k + ((turn + 2) & 3) * sum
#define l(k) k + ((turn + 3) & 3) * sum
const
int maxn = 100005;
const
int maxm = 2000005;
const
int inf = 1000000000;
bool vis[maxn];
int n, m, cnt, sum, src, snk, ans, dis[maxn];
int tot, ter[maxm], len[maxm], wei[maxm], nxt[maxm], lnk[maxn];
inline
void add(int u, int v, int w0, int w1)
void addedge(int u, int v, int w0, int w1, int type)
add(u, v, w0, w1);
add(v, u, 0, -w1);
}bool spfa(int s, int t) }}
}return dis[t] < inf;
}int find(int u, int lft)
vis[u] = 1;
int w0, w1, tmp, res = 0;
for (int v, i = lnk[u]; ~i && res < lft; i = nxt[i]) }}
vis[u] = 0;
return res;
}int mcmf()
}return res;
}int main() else
if (i > 1)
if (j > 1)
if (shape & 1)
if (shape & 2)
if (shape & 4)
if (shape & 8)
switch (shape) }}
cnt >>= 1;
if (mcmf() == cnt) else
return
0;}
清華集訓 2017 無限之環
無限之wa 本題如果知道是網路流的話,其實建圖不算特別神奇,但是比較麻煩。資料範圍過大,插頭dp不能處理,而且是乙個網格圖,考慮網路流。先看是不是二分圖?每個格仔只會和相鄰四個格仔發生關係 所以,黑白染色正好。i j為偶數左部點,i j為奇數右部點 不漏水是什麼?每個管道的四個口都能和別的接好。s向...
BZOJ5120無限之環 費用流
傳送門 題意 看原題吧,想不出比原題更好的描述了 solution 一開始思考過用網路流,但是想不出如何建圖,最後還是去看了題解qwq,建圖思路很妙啊,我們先把每個點拆成四個小點,分別對應上,下,左,右,然後對應每種水管在點內分別建圖 細節大家可以結合 思考一下 由於這是乙個二分圖 拆點之前 所以說...
洛谷P4003 無限之環 費用流
曾經有一款流行的遊戲,叫做 infinity loop,先來簡單的介紹一下這個遊戲 遊戲在乙個n m n m的網格狀棋盤上進行,其中有些小方格中會有水管,水管可能在 格某些方向的邊界的中點有介面,所有水管的粗細都相同,所以如果兩個相鄰方格的 共邊界的中點都有接頭,那麼可以看作這兩個接頭互相連線。水管...