#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 1000
#define MAXK 1000
int N, K;
bool can[MAXN][MAXK]; //can[i][j] 计算机i能处理任务j
void solve(void) {
int s = N + K, t = s + 1;
// 0~N-1: 计算机对应的顶点
// N~N+K-1: 任务对应的顶点
//在源点和计算机之间连边
for(int i = 0; i < N; ++i)
add_edge(s, i, 1);
//在任务和汇点之间连边
for(int i = 0; i < K; ++i)
add_edge(N + i, t, 1);
//计算机和任务之间连边
for(int i = 0; i < N; ++i)
for(int j = 0; j < K; ++j)
if(can[i][j])
add_edge(i, N + i, 1);
printf("%d\n", max_flow(s, t));
}
int V; //顶点数
vector<int> G[MAXV];
int match[MAXV];
bool used[MAXV];
add_edge(int u, int v) {
G[u].push_back(v);
G[v].push_back(u);
}
//通过DFS寻找增广路
bool dfs(int v) {
used[v] = true;
for(int i = 0; i < G[v].size(); ++i) {
int u = G[v][i], w = match[u];
if(w < 0 || !used[w] && dfs(w)) {
match[v] = u;
match[u] = v;
return true;
}
}
return false;
}
int bipartite_matching(void) {
int res = 0;
memset(match, -1, sizeof(match));
for(int v = 0; v < V; ++v) {
if(match[v] < 0) {
memset(used, 0, sizeof(used));
if(dfs[v])
++res;
}
}
res;
}
match_flow
最新推荐文章于 2024-05-29 21:44:39 发布