A Za, A Za, Fighting...

坚信:勤能补拙

PKU 2060 Taxi Cab Scheme

问题:
http://poj.org/problem?id=2060

思路:
将每一个Taxi订单作为顶点,根据题意如果订单i与订单j可以在规定时间内到达,那么说顶点i与顶点j存在一条边
最小路径覆盖问题可以转化为最大匹配问题
见: http://www.cppblog.com/Joe/archive/2010/10/21/130676.html

代码:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define MAX_LEN 501
 5 #define Abs(a) ((a)>=0 ? (a) : (a)*(-1))
 6 int M;
 7 int graph[MAX_LEN][MAX_LEN];
 8 int state[MAX_LEN], fwd[MAX_LEN], bwd[MAX_LEN];
 9 struct Taxi {
10     int hour, minu;
11     int sx, sy, dx, dy;
12 }rides[MAX_LEN];
13 
14 int
15 reachable(struct Taxi *fst, struct Taxi *scd)
16 {
17     int h, m;
18     h = fst->hour;
19     m = fst->minu + Abs(fst->dx-fst->sx) + Abs(fst->dy-fst->sy) + Abs(scd->sx-fst->dx) + Abs(scd->sy-fst->dy);
20     h = (h+m/60);
21     m = m%60;
22     if(h >= 24)
23         return 0;
24     if(h == scd->hour)
25         return (m<scd->minu);
26     return (h<scd->hour);
27 }
28 
29 void
30 build_graph()
31 {
32     int i, j;
33     memset(graph, 0sizeof(graph));
34     for(i=0; i<M; i++)
35         for(j=i+1; j<M; j++)
36             if(reachable(rides+i, rides+j))
37                 graph[i][j] = 1;
38 }
39 
40 int
41 find_path(int u)
42 {
43     int i;
44     for(i=0; i<M; i++) {
45         if(graph[u][i] && !state[i]) {
46             state[i] = 1;
47             if(bwd[i]==-1 || find_path(bwd[i])) {
48                 bwd[i] = u;
49                 fwd[u] = i;
50                 return 1;
51             }
52         }
53     }
54     return 0;
55 }
56 
57 int 
58 MaxMatch()
59 {
60     int i, ans = 0;
61     memset(fwd, -1sizeof(fwd));
62     memset(bwd, -1sizeof(bwd));
63     for(i=0; i<M; i++) {
64         if(fwd[i] == -1) {
65             memset(state, 0sizeof(state));
66             if(find_path(i))
67                 ++ans;
68         }
69     }
70     return ans;
71 }
72 
73 int
74 main(int argc, char **argv)
75 {
76     int i, tests;
77     scanf("%d"&tests);
78     while(tests--) {
79         scanf("%d"&M);
80         for(i=0; i<M; i++
81             scanf("%d:%d %d %d %d %d"&rides[i].hour, &rides[i].minu, &rides[i].sx, &rides[i].sy, &rides[i].dx, &rides[i].dy);
82         build_graph();
83         printf("%d\n", M-MaxMatch());
84     }
85 }

posted on 2010-10-21 00:18 simplyzhao 阅读(395) 评论(0)  编辑 收藏 引用 所属分类: F_图算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜