Vijos P1212 Way Selection
题目
背景
小杉家族遭遇了前所未有的大危机
他想知道怎么逃生
描述
小杉家族r个人正在一片空地上散步,突然,外星人来了……
留给小杉家族脱逃的时间只有t秒,每个小杉都有一个跑的速度v
总共有a个传送点,小杉们必须在t秒内到达传送点才能脱逃
另外一个小杉进入一个传送点以后,该传送点就会消失
现在请你安排一种方案,使脱逃的小杉尽可能的多
格式
输入格式
每组测试数据的
第一行有三个整数r和a和t(0
1 1 1
1 1
1 1 1
样例输出1
1
限制
每个测试点1s
提示
简单的很,别想复杂了
来源
lolanv
题解
二分图,把可以到的传送门建一条边
(题目给的是实数……又多WA了几遍,QAQ)
代码
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int n,m,t,tot,ans;
int lnk[1005],s[1005];
double x1[1005],y1[1005],x2[1005],y2[1005],v[1005];
bool vis[1005];
struct edge
{
int nxt,y;
} e[1000005];
void add(int x,int y)
{
tot++;e[tot].nxt=lnk[x];lnk[x]=tot;e[tot].y=y;
}
int dfs(int x)
{
for (int i=lnk[x];i;i=e[i].nxt)
{
if (vis[e[i].y]==false) {
vis[e[i].y]=true;
if (!s[e[i].y]||dfs(s[e[i].y]))
{
s[e[i].y]=x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for (int i=1;i<=m;i++) scanf("%lf%lf",&x2[i],&y2[i]);
for (int i=1;i<=n;i++) scanf("%lf%lf%lf",&x1[i],&y1[i],&v[i]);
t=t*t;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (v[i]*v[i]*t>=(x1[i]-x2[j])*(x1[i]-x2[j])+(y1[i]-y2[j])*(y1[i]-y2[j])) add(i,j);
memset(s,0,sizeof(s));
for (int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if (dfs(i)) ans++;
}
printf("%d",ans);
return 0;
}