乙個完美的迴圈格是這樣定義的:對於任意乙個起始位置,你都可以沿著箭頭最終回到起始位置。如果乙個迴圈格不滿足完美,你可以隨意修改任意乙個元素的箭頭直到完美。例如下圖,左邊不是乙個完美的迴圈格,因為只有從(1,
1),(
1,2)
,(2,
0),(
2,3)
(1,1),(1,2),(2,0),(2,3)
(1,1),
(1,2
),(2
,0),
(2,3
)出發才會回到起始位置。通過修改其中兩個箭頭,可以得到右圖,乙個完美的迴圈格。
給定乙個迴圈格,你需要計算最少需要修改多少個元素使其完美。
一眼題啊,最多藍題。題解和標籤都沒看就過了。
先證明完美迴圈格所有的點入度為1。
所以我們可以大膽猜想,所有點入度均為1的圖就是完美的。所以可以把所有點拆成入點和出點,出點向四周的入點連邊,若和原來的方向一致則費用為0,否則費用為1。
源點連向所有出點,所有入點連向匯點。圖中所有邊流量為1。顯然這個圖的最大流是n×m
n\times m
n×m,所以可以保證最終的費用答案是可以滿足條件的。
#include
#include
#include
using
namespace std;
const
int n=
1010
,m=50010
,inf=
1e9;
const
char way=
;int n,m,tot=
1,s,t,cost,head[n]
,dis[n]
,pre[n]
;bool vis[n]
;char ch;
struct edge
e[m]
;intc(
int x,
int y)
void
add(
int from,
int to,
int flow,
int cost)
bool
spfa()
}}}return dis[t]
}void
addflow()
cost+
=dis[t]
*minflow;
}int
mcmf()
intmain()
}mcmf()
;printf
("%d\n"
,cost)
;return0;
}
洛谷P4043 費用流
這題的建圖方式可以模擬洛谷p1251 我是由那個題才想到這麼建的,由於每條邊至少經過一次,我們又不清楚需要跑多少次,把邊看成點,點與匯點相連,可是我們又不知道最大流應該是多少,直接這麼連會發生錯誤。利用那道題的思想,每條邊最少需要一次,那麼就每條邊看做兩個點,點1和點2,點1有1的流量流向匯點,點2...
最小費用流 洛谷P2053
傳送門 教練我想學數學建模。網路流和最小費用流的題目不存在 難度,不存在變形 目前來說是的,不知道是不是我沒做過對於模板修改的題目 難度主要在於,你能看出來它是個網路流,並且還能正確的建模。大喊一句,教練我想學數學建模!這個題目建模不是很簡單。首先,我們要知道乙個人可以修n輛車,那麼m個人就可以修n...
洛谷P3381 Dijkstra版費用流
鑑於spfa很容易被卡,所以學了一手dij跑費用流 具體參考 雖然有個小地方少了個負號,不過還好 區別就是把 u v 邊權變成cost h u h v 先用spfa算出dis當h i 然後每次跑完mcf,由於負權邊的容量可能增加能選了,就要h i dis i 這樣動態維護,就能保證每條邊都是正的 i...