原题 构图+简单路径覆盖 #include <iostream> #include <algorithm> #define MAXN 510 using namespace std ; struct Ride { int minutes , a , b , c , d , cost ; } ; struct Graph { int v , next ; }; Graph G[MAXN * MAXN] ; Ride R[MAXN] ; int n , first[MAXN] , link[MAXN] ; bool visited[MAXN] ; inline int Cost (int a , int b , int c , int d) { return abs (a - c) + abs (b - d) ; } void Read () { int i , h , m ; scanf ("%d" , &n) ; for (i = 0 ; i < n ; i ++) { scanf ("%d:%d%d%d%d%d" , &h , &m , &R[i].a , &R[i].b , &R[i].c , &R[i].d) ; R[i].minutes = h * 60 + m ; R[i].cost = Cost (R[i].a , R[i].b , R[i].c , R[i].d) ; } } void BuildGraph () { int i , j , tot ; memset (link , -1 , sizeof (link)) ; memset (first , -1 , sizeof (first)) ; for (i = tot = 0 ; i < n ; i ++) for (j = i + 1 ; j < n ; j ++) if (R[i].minutes + R[i].cost + Cost (R[i].c , R[i].d , R[j].a , R[j].b) < R[j].minutes) { G[tot].v = j ; G[tot].next = first[i] ; first[i] = tot ++ ; } } bool Find (int s) { int tmp ; for (tmp = first[s] ; tmp != -1 ; tmp = G[tmp].next) if (!visited[G[tmp].v]) { visited[G[tmp].v] = true ; if (link[G[tmp].v] == -1 || Find (link[G[tmp].v])) { link[G[tmp].v] = s ; return true ; } } return false ; } void Solve () { int i , m ; for (i = n - 1 ; i >= 0 ; i --) { memset (visited , false , sizeof (visited)) ; Find (i) ; } for (m = i = 0 ; i < n ; i ++) if (link[i] != -1) m ++ ; printf ("%d/n" , n - m) ; } int main () { int t ; scanf ("%d" , &t) ; while (t --) { Read () ; BuildGraph () ; Solve () ; } return 0 ; }