1 // File Name: 2060.cpp
2 // Author: Missa
3 // Created Time: 2013/2/11 星期一 17:11:30
4
5 //最小路径覆盖数=顶点数-二分图最大匹配数
6 #include<iostream>
7 #include<cstdio>
8 #include<cstring>
9 #include<algorithm>
10 #include<cmath>
11 #include<queue>
12 #include<stack>
13 #include<string>
14 #include<vector>
15 #include<cstdlib>
16 #include<map>
17 using namespace std;
18
19 const int maxn = 5e2+5;
20 int n;
21 struct Cust
22 {
23 int src;
24 int x1,y1,x2,y2;
25 int end;
26 }cust[maxn];
27 //*******************匈牙利算法*************************
28 int nx,ny;
29 bool vis[maxn];
30 int ma[maxn][maxn];
31 int link[maxn];
32 bool dfs(int x)
33 {
34 for(int y=1;y<=ny;y++)
35 {
36 if(!vis[y] && ma[x][y])
37 {
38 vis[y]=1;
39 if(link[y]==-1 || dfs(link[y]))
40 {
41 link[y]=x;
42 return true;
43 }
44 }
45 }
46 return false;
47 }
48 int maxmatch()
49 {
50 int c=0;
51 memset(link,-1,sizeof(link));
52 for(int x=1;x<=nx;x++)
53 {
54 memset(vis,0,sizeof(vis));
55 if(dfs(x)) c++;
56 }
57 return c;
58 }
59 //******************************************************
60 bool ok(int i,int j)
61 {
62 if(cust[i].end+abs(cust[i].x2-cust[j].x1)+abs(cust[i].y2-cust[j].y1)<cust[j].src)
63 return true;
64 return false;
65 }
66 int main()
67 {
68 int t;
69 scanf("%d",&t);
70 while(t--)
71 {
72 scanf("%d",&n);
73 memset(cust,0,sizeof(cust));
74 for(int i=1;i<=n;i++)
75 {
76 int a,b;
77 scanf("%d:%d",&a,&b);
78 cust[i].src=a*60+b;
79 scanf("%d%d%d%d",&cust[i].x1,&cust[i].y1,&cust[i].x2,&cust[i].y2);
80 cust[i].end=cust[i].src+abs(cust[i].x1-cust[i].x2)+abs(cust[i].y1-cust[i].y2);
81 }
82 memset(ma,0,sizeof(ma));
83 for(int i=1;i<=n;i++)
84 {
85 for(int j=1;j<=n;j++)
86 {
87 if(i==j) continue;
88 if(ok(i,j)) ma[i][j]=1;
89 }
90 }
91 nx=ny=n;
92 printf("%d\n",n-maxmatch());
93 }
94 return 0;
95 }