這題考察的是最小割。
我們可以這樣想:海岸線的長短變化都是e引起的,我們通過把』e'變成'.'或'd'來使海岸線最大化。
我們要算海岸線就是算格仔『.'和格仔'd'(在原有地圖周圍四面都要加』d『)相鄰的面數,要使它最大,就是要使'.'與』.';'d'與'd'相鄰的面數最小,而面數最小可以用最小割來做。
現在我們先把格仔上的點黑白染色,(i+j)%2==1的為a類,為0的為b類,
在a類中,所的』.'與源點相連(容量為inf),所有的』d'與匯點相連(容量為inf)。
在b類中,所有的『.'與匯點相連(容量為inf),所有的'd'與源點相連(容量為inf)。
e不與源點,匯點相連。
所有的點與周圍的四個點連一條有向邊(容量為1)。
圖建好啦,跑一下最大流,ans=總的面-最大流。
現在讓我們來研究一下這圖的一些性質:
首先,只有』.'到『.『,』d'到'd『的路徑能聯通源點匯點
其次,考慮'e'。
如果與『e』相連的四個點都是'.'或都是'd『,那這個』e『,不可能有流通過,也就是它最終的屬性肯定與周圍的是相反的!
其次如果與『e'相鄰的有』.'和『d'(這裡的'.'和』d'要麼都屬於a類,要麼都屬於b類),那麼就可能會有不同的流通過(這就是在給e定屬性了)。
我們通過最大流演算法求出圖的最小割,也就是兩邊相同的面數的最小值。
#include#include#include
#include
#include
using
namespace
std;
const
int maxn = 55
;const
int inf=0x3f3f3f3f
;struct
edge
};struct
dinic
void addedge(int
from, int to, int
cap)
bool
bfs() }}
return
vis[t];
}int dfs(int x, int
a) }
return
flow;
}int maxflow(int s, int
t)
return
flow;
}}dinic;
char
str[maxn][maxn];
intmp[maxn][maxn];
intn, m,tot;
const
int dx = ;
const
int dy = ;
void
init()
intmain()
n++, m++;
for (int i = 0; i <= n; i++) str[i][0] = str[i][m] = 'd'
;
for (int j = 0; j <= m; j++) str[0][j] = str[n][j] = 'd'
;
for (int i = 0; i <= n; i++)
}dinic.init(tot+1
);
for (int i = 0; i <= n; i++)
if ((i + j) % 2
)
else
if (str[i][j] == 'd'
) }
else
else
if(str[i][j]=='d'
) }}}
int tmp = dinic.maxflow(0
, tot);
int ans = (n+1)*(m+1)*2-(m+1)-(n+1)-tmp;
printf(
"case %d: %d\n
",++kase, ans);
}return0;
}
HDU 4859 海岸線 最小割
強烈建議閱讀一下最小割模型在資訊學競賽中的應用 其中2.2.2的optimal marks一題和此題建模非常相像。在原圖外圍虛擬一圈 d 我們要最大化的周長,就可以等價為最大化相鄰的 d 和 的總對數,也就是最大化相鄰格仔不同型別的總對數。按照 中的建圖方式,我們可以最小化相鄰格仔不同型別,反過來想...
hdu 4859 海岸線(最小割)
題目 建模 一種新的建圖思路 周圍加了一圈d,令d為奇,為偶,若d確實為奇,與ss連inf,若為偶,與tt 連 inf。同理。然後與周圍的點連 1 盡量保持不變的 習慣,最小割就從 1,1 開始建。include include include include include include def...
hdu 4859 海岸線 最小割
歡迎來到珠海!由於土地資源越來越緊張,使得許多海濱城市都只能依靠填海來擴充套件市區以求發展。作為z市的決策人,在仔細觀察了z市地圖之後,你準備通過填充某些海域來擴充套件z市的海岸線到最長,來吸引更多的遊客前來旅遊度假。為了簡化問題,假設地圖為乙個n m的格仔,其中一些是陸地,一些是可以填充的淺海域,...