P4003 無限之環

2022-10-09 01:18:10 字數 2781 閱讀 9235

題面自己看吧。。。

std對於這種毒瘤的最小費用匹配問題,一般考慮網路費用流。

對於每個水管的每乙個支管,有且僅有乙個其它方格上的水管的其中乙個支管與其相連,這樣就不會漏水了,也就是乙個水管的每個支管容量只能為 \(1\),且都要滿流。

由於我們要用網路流,又考慮到只有相鄰的兩個水管又可能產生流量,於是考慮將圖黑白染色。

這樣黑點只能連向白點,白點只能連向黑點。

然後將乙個方格拆成 \(5\) 個點,分別表示上下左右中。

模型建立

\(s\) 向白點的中點連一條容量為支管數量,費用為 \(0\) 的邊。

黑點的中點向 \(t\) 連一條容量為支管數量,費用為 \(0\) 的邊。

根據支管情況向四周連容量為 \(1\),費用為 \(0\) 的邊。

然後分水管的情況討論:

上點分別向左,右點向一條容量為 \(1\),費用為 \(1\) 的邊** \(90\) 度)。

上點向下點連向一條容量為 \(1\),費用為 \(2\) 的邊** \(180\) 度)。

由於不用旋轉,那麼只需讓中點分別向上、下點連一條容量為 \(1\),費用為 \(0\) 的邊(上面說過了)。

順時針轉 \(90\) 度,會變成這樣:

這相當於原來的上點變成了下點,右點不變,那麼讓上點向下點連一條容量為 \(1\),費用為 \(1\) 的邊即可。

逆時針轉 \(90\) 度同理,讓右點向左點連一條容量為 \(1\),費用為 \(1\) 的邊即可。

轉 \(180\) 度,會變成這樣:

這相當於,你將前面說的兩條邊一起用了。

順時針轉 \(90\) 度,會變成這樣:

這相當於上、右點不變,左點變成了下點,於是讓左點向下點連一條容量為 \(1\),費用為 \(1\) 的邊即可。

逆時針轉 \(90\) 度同理,讓右點向下點連一條容量為 \(1\),費用為 \(1\) 的邊即可。

轉 \(180\) 度,會變成這樣:

這相當於左、右點不變,上點變成了下點,於是讓上點向下點連一條容量為 \(1\),費用為 \(2\) 的邊即可。

由於這轉了相當於沒轉,那麼不管他。

\(\text\)。

#include using namespace std;

inline int read()

while (c >= '0' && c <= '9')

return x * f;

}inline void write(int x)

if (x > 9)

write(x / 10);

putchar(x % 10 + '0');

}typedef int tp;

const int _ = 6e4 + 10, inf = 947483647;

int n, m, s, t, lv[_], cur[_];

tp maxflow, mincost;

int tot = 1, head[_], to[_ << 1], nxt[_ << 1];

tp dis[_], w[_ << 1], fl[_ << 1];

inline void add(int u, int v, tp dis, tp c)

inline void add(int u, int v, tp dis, tp c)

inline bool bfs()}}

}return dis[t] != inf;

}tp dfs(int p = s, tp flow = inf)

}lv[p] = 0;

return flow - rmn;

}inline void dinic()

}inline int id(int x, int y, int num)

int sum;

const int dx = , dy = , cross = ;

inline void build(int x, int y, int num)

for (int i = 0; i < 4; ++i)

if (num & (1 << i))

switch (num)

}else

switch (num)

}}signed main()

dinic();

write(maxflow * 2 == sum ? mincost : -1);

return 0;

}

洛谷P4003 無限之環 費用流

曾經有一款流行的遊戲,叫做 infinity loop,先來簡單的介紹一下這個遊戲 遊戲在乙個n m n m的網格狀棋盤上進行,其中有些小方格中會有水管,水管可能在 格某些方向的邊界的中點有介面,所有水管的粗細都相同,所以如果兩個相鄰方格的 共邊界的中點都有接頭,那麼可以看作這兩個接頭互相連線。水管...

LG4003 無限之環 題解

狀態壓縮,動態規劃。碎碎念 考場上看到這個題的一瞬間想到了要費用流,但是不會建圖。剛剛準備自閉的時候突然發現好像可以狀態壓縮。狀壓打完了發現這玩意狀態好少啊 果然拿個 map 存一下就過了 題面給定乙個 n times m 的網格圖,有 15 種形狀的水管排布在裡面,需要這些水管互相相連,每次可以轉...

清華集訓 2017 無限之環

無限之wa 本題如果知道是網路流的話,其實建圖不算特別神奇,但是比較麻煩。資料範圍過大,插頭dp不能處理,而且是乙個網格圖,考慮網路流。先看是不是二分圖?每個格仔只會和相鄰四個格仔發生關係 所以,黑白染色正好。i j為偶數左部點,i j為奇數右部點 不漏水是什麼?每個管道的四個口都能和別的接好。s向...