又是反過來考慮。。。。。
直接計算會很複雜(畢竟每一行和每一列都會有一定的限制條件,很難同時滿足),那麼我們放過來思考,先把所有的各自都放上士兵一共n*m-k個,然後考慮拿走一部分士兵。
源點向每行建邊,邊權是:m-l[i]-這一行的障礙格仔數目,即是能夠拿走的士兵數目,然後列向匯點建邊,同理,每乙個格仔(可拿走)使得所在行和列連上邊權為1得邊,最後ans減去最大流就好了
//加了一句話快了8ms
#include#include#include#define maxn 20005
using namespace std;
int n,m,k,h[maxn],q[maxn],tot,head[maxn],top,l[maxn],c[maxn],ans;
int cn[maxn],cm[maxn],mat[102][102],s,t,last[maxn];
struct edgee[maxn];
void adde(int a,int b,int c)
void build()
bool bfs()
} }return h[t]!=-1;
}int dfs(int u,int f)
if(!used)h[u]=-1;
return used;
}void solve()
}int main()
build();
solve();
cout
}
BZOJ1458 士兵占領(最大流)
傳送門 判斷joing 的條件是顯然的 如果行或列的總點數減去障礙數還不夠li或ci的話,肯定無解。我的建圖比較奇怪。三排點,分別為每一行,每個點,每一列。s 每一行,li 每一列 t,ci 每一行 當前行中的點,1 每個點 所在的列,1 注意這裡的點必須不是障礙點。最大流即為答案。貼上hzwer的...
BZOJ1458 士兵占領 最大流
time limit 10 sec memory limit 64 mb submit 917 solved 515 submit status discuss 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...
bzoj1458 士兵占領 最大流
time limit 10 sec memory limit 64 mb submit status discuss 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個...