ZOJ 1882 Gopher II(二分图最大匹配)

来源:互联网 发布:vr一体机 知乎 编辑:程序博客网 时间:2024/05/21 12:45

把每只gopher 和 能在s时间内到达的洞穴连边,然后匈牙利算法就可以了.

#include <iostream>#include <cstdio>#include <memory.h>#include <cmath>using namespace std;const int maxn = 210;struct edge{int v, next;}es[maxn * 10];double x[maxn], y[maxn];int fa[maxn], head[maxn], n, m, s, v;bool vis[maxn];bool dfs(int u){for (int ne = head[u]; ne != -1; ne = es[ne].next){int v = es[ne].v;if (!vis[v]){vis[v] = 1;if(fa[v] ==0 || dfs(fa[v])){fa[v] = u;return true;}}}return false;}int hungary(){int ans = 0;memset(fa, 0, sizeof(fa));for (int i = 1; i <= n; ++i){memset(vis, 0, sizeof(vis));if(dfs(i)){ans++;}}return ans;}void addEdge(int u, int v, int eidx){es[eidx].v = v;es[eidx].next = head[u];head[u] = eidx;}int main(){while (~scanf("%d %d %d %d", &n, &m, &s, &v)){memset(head, -1, sizeof(head));for (int i = 1 ; i <= n; ++i){scanf("%lf %lf", &x[i], &y[i]);}m += n;for (int i = n + 1; i <= m; ++i){scanf("%lf %lf", &x[i], &y[i]);}int eidx = 0;for (int i = 1; i <= n; ++i){for (int j = n + 1; j <= m; ++j){double d = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));if(d / v  <= s){addEdge(i, j, eidx++);addEdge(j, i, eidx++);}}}printf("%d\n",n - hungary());}return 0;}