Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 231 Accepted Submission(s): 142
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <vector> 7 using namespace std; 8 9 const int maxn = 500 + 11; 10 vector<int> gra[maxn]; 11 struct Point{ 12 int x, y; 13 }; 14 struct Node{ 15 int st, en; 16 Point p1, p2; 17 }node[maxn]; 18 bool mark[maxn]; 19 int xx[maxn], yy[maxn]; 20 int m; 21 22 inline int getTime(Point a, Point b); 23 int dfs(int u); 24 int maxMatch(); 25 26 int main(){ 27 int t; 28 scanf("%d", &t); 29 while(t--){ 30 scanf("%d", &m); 31 for(int i = 1; i <= m; ++i){ 32 gra[i].clear(); 33 } 34 35 int hour, mi; 36 for(int i = 1; i <= m; ++i){ 37 scanf("%d:%d %d %d %d %d", &hour, &mi, &node[i].p1.x, &node[i].p1.y, &node[i].p2.x, &node[i].p2.y); 38 node[i].st = hour * 60 + mi; 39 node[i].en = node[i].st + getTime(node[i].p1, node[i].p2); 40 } 41 42 for(int i = 1; i <= m; ++i){ 43 for(int j = i+1; j <= m; ++j){ 44 if(node[i].en + getTime(node[i].p2, node[j].p1) < node[j].st){ 45 gra[i].push_back(j); 46 } 47 } 48 } 49 50 int ans = maxMatch(); 51 printf("%d\n", m-ans); 52 } 53 return 0; 54 } 55 56 inline int getTime(Point a, Point b){ 57 return abs(a.x-b.x) + abs(a.y-b.y); 58 } 59 60 int maxMatch(){ 61 int res = 0; 62 memset(xx, -1, sizeof(xx)); 63 memset(yy, -1, sizeof(yy)); 64 65 for(int i = 1; i <= m; ++i){ 66 if(xx[i] == -1){ 67 memset(mark, false, sizeof(mark)); 68 res += dfs(i); 69 } 70 } 71 72 return res; 73 } 74 75 int dfs(int u){ 76 for(int i = 0; i < (int)gra[u].size(); ++i){ 77 int v = gra[u][i]; 78 if(!mark[v]){ 79 mark[v] = true; 80 if(yy[v] == -1 || dfs(yy[v])){ 81 yy[v] = u; 82 xx[u] = v; 83 return 1; 84 } 85 } 86 } 87 return 0; 88 }
【HDU1960】Taxi Cab Scheme(最小路径覆盖)
原文:http://www.cnblogs.com/auguralpha/p/4593055.html