p1882_二分匹配.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 65 行

CPP
65
字号
// p1882.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

int	N , M;
bool	graph [100] [100];
double X [200] , Y [200];
double	Limit;

int	Link [100];
bool	mk [100];

bool	init ()
{
	int	S , V , i , j;
	double	d;
	if ( scanf ( "%d%d%d%d" , &N , &M , &S , &V ) == EOF ) return false;
	Limit = double ( S ) * V , Limit *= Limit;
	for ( i = 0; i < N; i ++ ) scanf ( "%lf %lf" , &X [i] , &Y [i] );
	for ( i = 0; i < M; i ++ ) scanf ( "%lf %lf" , &X [100 + i] , &Y [100 + i] );

	for ( i = 0; i < N; i ++ )
		for ( j = 0; j < M; j ++ ) {
			d = ( X [i] - X [j + 100] ) * ( X [i] - X [j + 100] ) + ( Y [i] - Y [j + 100] ) * ( Y [i] - Y [j + 100] );
			graph [i] [j] = d <= Limit;
		}
	return true;
}

bool	find ( int v )
{
	int	i , t;
	for ( i = 0; i < M; i ++ ) if ( !mk [i] && graph [v] [i] ) {
		mk [i] = true;
		t = Link [i];
		Link [i] = v;
		if ( t == -1 || find ( t )) return true;
		Link [i] = t;
	}
	return false;
}

int	Ans ()
{
	int	Ret = 0 , i;
	memset ( Link , 0xff , sizeof ( Link ));
	for ( i = 0; i < N; i ++ ) {
		memset ( mk , 0 , sizeof ( mk ));
		if ( find ( i ) ) Ret ++;
	}
	return Ret;
}

int main(int argc, char* argv[])
{
	freopen ( "p.in" , "r" , stdin );

	while ( init () )
		printf ( "%d\n" , N - Ans ());
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?