清華集訓 2017 無限之環(費用流)

2021-08-20 22:23:28 字數 1998 閱讀 8062

【清華集訓 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的網格狀棋盤上進行,其中有些小方格中會有水管,水管可能在 格某些方向的邊界的中點有介面,所有水管的粗細都相同,所以如果兩個相鄰方格的 共邊界的中點都有接頭,那麼可以看作這兩個接頭互相連線。水管...