private static void Main(string[] args)
{
int numTestCases = int.Parse(Console.ReadLine());
for (int testCaseNum = 0; testCaseNum < numTestCases; testCaseNum++)
{
var ints = GetSplitInts();
var numPersons = ints[0];
var numTaxis = ints[1];
var speed = ints[2]; //speed in meters per second
var timeLimit = ints[3]; //time limit to collect a person
int totalNodes = numTaxis + numPersons;
Node[] nodes = new Node[totalNodes];
for (int personNum = 0; personNum < numPersons; personNum++)
{
var personLine = GetSplitInts();
Node person = new Node() {Number = personNum};
person.X = personLine[0];
person.Y = personLine[1];
nodes[personNum] = person;
}
for (int taxiNum = 0; taxiNum < numTaxis; taxiNum++)
{
var taxiLine = GetSplitInts();
Node taxi = new Node() { Number = numPersons+taxiNum };
taxi.X = taxiLine[0];
taxi.Y = taxiLine[1];
nodes[taxi.Number] = taxi;
}
//find the bipartite graph
FindBipartiteGraph(nodes, numPersons, numTaxis, speed, timeLimit);
//work out the max cardinality
int maxCardinality = GetMaximumCardinality(nodes, numPersons, numTaxis);
Console.WriteLine("{0}: {1}", testCaseNum+1, maxCardinality);
}
}