poj 2536 Gopher II 最大二分匹配
这题难点建图。
建图方式如下:要是在给定的s时间内能跑到洞穴(判断两点距离),那么那两个点是连通的,否则就不连通
#include<iostream>
using namespace std;
const int MAX = 300;
struct coordinate
{
double x,y;
};
coordinate gopher[MAX];
coordinate holes[MAX];
bool arcs[MAX][MAX];
bool isvisit[MAX];
int match[MAX];
int n, m, s, v;
bool find(int u)
{
for (int i = 1; i <= m; i++)
if (arcs[u][i] && !isvisit[i])
{
isvisit[i] = true;
if (!match[i] || find(match[i]))
{
match[i] = u;
return true;
}
}
return false;
}
int main()
{
while (cin >> n >> m >> s >> v)
{
double d = s*v*s*v;
for (int i = 0; i < n; i++)
cin >> gopher[i].x >> gopher[i].y;
for (int i = 0; i < m; i++)
cin >> holes[i].x >> holes[i].y;
memset(arcs, false, sizeof(arcs));
memset(match, 0, sizeof(match));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if ((holes[j].x - gopher[i].x)*(holes[j].x - gopher[i].x) + (holes[j].y - gopher[i].y)*(holes[j].y - gopher[i].y) <= d)
arcs[i+1][j+1] = true;
int ans = 0;
for (int i = 1; i <= n; i++)
{
memset(isvisit, false, sizeof(isvisit));
if (find(i))
ans++;
}
cout << n - ans << endl;
}
return 0;
}
浙公网安备 33010602011771号