【vijos】【二分图最大匹配】银翼の舞
描述
怪盗基德如约来到OIBH组织的大门,却发现OIBH组织的大门紧闭。而两旁两个小门则打开着。基德仔细观察之后发现了一些端倪:这两个小门门框上都装着红外线扫描器,能够对通过的物体作出反应。为了对付红外线扫描器,基德能够驱使他的滑翔翼高速飞行制造出N-1个幻影。但由于飞行时速度的不同,创造出的幻影速度也不同。两个幻影之间或幻影与基德之间若速度差距超过k,就会被红外线扫描器识别出来。因此这两个幻影(或幻影与基德)就不能从同一个门内进入。现在已知基德本身的速度和每个幻影的速度,请问基德能否带领所有幻影进入OIBH组织?
格式
输入格式
第1行三个整数n,v,k。v为基德本身的速度。n,k意义如题目所述。
第2行n-1个整数vi,表示n-1个幻影的速度。
输出格式
Yes或No,表示基德能否带领所有幻影进入OIBH组织。
代码
刚刚学二分图的知识,比较丑,见谅啦~(≧▽≦)/~啦啦啦
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,k,match[1000],ans=0;
long long v[2000],left[1000],right[1000];
bool line[1000][1000],used[1000];
bool find(int x){
for(int i=1;i<=(n%2!=0?n/2+1:n/2);i++){
if(line[x][i]&&!used[i]){
used[i]=true;
if(match[i]==0||find(match[i])){
match[i]=x;
return true;
}
}
}
return false;
}
int main(){
//freopen("in.txt","r",stdin);
//memset(used,0,sizeof(used));
memset(line,0,sizeof(line));
memset(match,0,sizeof(match));
scanf("%d %lld %d",&n,&v[1],&k);
for(int i=2;i<=n;i++) scanf("%lld",&v[i]);
for(int i=1;i<=n/2;i++){
left[i]=v[i]; right[i]=v[i+n/2];
}
if(n%2!=0) right[n/2+1]=v[n];
for(int i=1;i<=n/2;i++)
for(int j=1;j<=(n%2!=0?n/2+1:n/2);j++)
if(abs(left[i]-right[j])<k) line[i][j]=true;
for(int i=1;i<=n/2;i++){
memset(used,0,sizeof(used));
if(find(i)) ans++;
}
if(ans==n/2) puts("Yes");
else puts("No");
return 0;
}