POJ 2060 最小路径覆盖

题意:

给出一个T 代表有T组样例

一个n 代表有n个任务

然后接下来n 个任务 给出出发时间和 出发地点(a, b)以及目的地(c, d)  从出发地到目的地花费时间为 |a - c| + |b - d|

 

问最少用多少辆车可以完成所有任务

思路:

根据第 i 个任务结束时间+从第 i 个任务的目的地到 第 j 个任务的出发地 < 第 j 个任务的开始时间

确立这两个任务是否可以连通..如果可以就连线

然后求出最大匹配

任务数 - 最大匹配 = 最短路径覆盖

 

Tips:

no tips..

Code:

View Code
 1 #include <stdio.h>

 2 #include <cstring>

 3 #define clr(x) memset(x, 0, sizeof(x))

 4 #define fabs(x) ((x) > 0?(x):-(x))

 5 

 6 const int INF = 0x1f1f1f1f;

 7 

 8 struct Ride

 9 {

10     int start;

11     int end;

12     int a, b, c, d;

13 }ride[510];

14 

15 struct Edge

16 {

17     int next;

18     int to;

19 }edge[1000000];

20 int tot;

21 int head[510];

22 

23 void add(int s, int u)

24 {

25     edge[tot].to = u;

26     edge[tot].next = head[s];

27     head[s] = tot++;

28 }

29 

30 

31  int link[510];

32  int vis[510];

33  int sum, n;

34 

35  int dfs(int x)

36  {

37      for(int i = head[x]; i != 0; i = edge[i].next){

38          int y = edge[i].to;

39          if(!vis[y]){

40              vis[y] = true;

41              if(link[y] == 0 || dfs(link[y])){

42                  link[y] = x;

43                  return true;

44              }

45          }

46      }

47      return false;

48  }

49 

50  void solve()

51  {

52      clr(link);

53      sum = 0;

54      for(int i = 1; i <= n; ++i){

55          clr(vis);

56          if(dfs(i))

57              sum++;

58      }

59  }

60 

61 

62 int main()

63 {

64     int i, j, k;

65     int T;

66     int h, m;

67     while(scanf("%d", &T) != EOF)

68     while(T--)

69     {

70         tot = 1;

71         clr(head);

72 

73         scanf("%d", &n);

74         for(i = 1; i <= n; ++i){

75             scanf("%d:%d %d %d %d %d", &h, &m, &ride[i].a, &ride[i].b, &ride[i].c, &ride[i].d);

76             ride[i].start = h*60+m;

77             ride[i].end = ride[i].start + fabs(ride[i].a-ride[i].c)+fabs(ride[i].b-ride[i].d);

78         }

79 

80         for(i = 1; i <= n; ++i)

81         for(j = 1; j <= n; ++j)

82         if(ride[i].end + fabs(ride[i].c-ride[j].a)+fabs(ride[i].d-ride[j].b) < ride[j].start)

83         add(i, j);

84 

85         solve();

86 

87         printf("%d\n", n-sum);

88     }

89     return 0;

90 }

你可能感兴趣的:(poj)