- Quiz
- AC
- 想定解
- 別解の最小費用流
- 辺を張りすぎてコンテスト中はTLE止まり
- れたすさんが辺の張り方を工夫して通した
- その方法は以下の画像の右下の通り(capacity = inf, cost = 1)
- 計算量
- 学び
- 辺が多すぎてフローできない時は、超頂点、または辺の張り方の工夫
#include <atcoder/mincostflow>
using namespace atcoder;
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll N;
cin>>N;
VI A(N);
rep(i, N) cin >> A[i];
VI O,Z;
rep(i,N){
if(A[i]==0){
Z.push_back(i);
}else{
O.push_back(i);
}
}
ll start=N;
ll goal=N+1;
mcf_graph<int, long long> g(N+2);
for(ll o : O){
g.add_edge(start,o,1,0);
}
rep(i,N-1){
g.add_edge(i,i+1,1e9,1);
g.add_edge(i+1,i,1e9,1);
}
for(ll z : Z){
g.add_edge(z,goal,1,0);
}
auto result = g.flow(start,goal,SZ(O));
ll cost = result.second;
p(cost);
return 0;
}