1. 程式人生 > >uvalive 3126 Taxi Cab Scheme

uvalive 3126 Taxi Cab Scheme

main 租車 res mem 如果 方便 定義 include spa

題意:

有m個人要坐出租車,每個人給出出發時間,出發地點和目的地(以二維坐標表示),兩個地點之間所花的時間計算方式是兩點之間的哈密頓距離。現在需要排遣車出去,一輛車每次只能裝一個人,如果一輛車在裝完一個人A之後,再到達另一個人B的出發地點的時間,比這個人的出發時間至少提前1分鐘,那麽這個車就可以乘坐B。

問排遣的最少的車的數目。

思路:

直觀的來看,每一輛車的路徑是一個DAG,那麽這個問題就轉化成了DAG的最小路徑覆蓋。

最小路徑覆蓋的定義:在一個有向圖中,找出最少的路徑,使得途中的所有點都被覆蓋,此題所求的最小路徑覆蓋是不相交的最小路徑覆蓋

最小路徑覆蓋的算法是把每個點拆成起點i和終點i’,如果有一條邊從i到j,那麽就從i向j’連邊,此時這個圖就成為了一個二分圖。

二分圖的最小路徑覆蓋= 點數 – 二分圖的最大匹配

然後此題就是兩點之間連邊的問題,時間可以換算成分鐘數表示比較方便,然後當一個點的結束時間加上 結束點到另一個點的行駛時間,如果這個時間小於另一個點的出發時間,那麽這兩點之間就可以連邊。

匈牙利算法,復雜度O(n^2)。

代碼:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <vector>
  4 using namespace std;
  5 
  6 const int N = 1005;
  7 typedef pair<int
,int> pii; 8 9 struct node 10 { 11 int st,en; 12 13 node(int a,int b) 14 { 15 st = a; 16 en = b; 17 } 18 }; 19 20 vector<pii> ps; 21 vector<node> ns; 22 vector<int> g[N]; 23 bool vis[N]; 24 int link[N]; 25 26 int mabs(int
x) 27 { 28 return x >= 0 ? x : -x; 29 } 30 31 bool dfs(int u) 32 { 33 for (int i = 0;i < g[u].size();i++) 34 { 35 int v = g[u][i]; 36 37 if (!vis[v]) 38 { 39 vis[v] = 1; 40 41 if (link[v] == -1 || dfs(link[v])) 42 { 43 link[v] = u; 44 link[u] = v; 45 46 return true; 47 } 48 } 49 } 50 51 return false; 52 } 53 54 int solve(int n) 55 { 56 memset(link,-1,sizeof(link)); 57 58 int res = 0; 59 60 for (int i = 0;i < n;i++) 61 { 62 if (link[i] == -1) 63 { 64 memset(vis,0,sizeof(vis)); 65 if (dfs(i)) res++; 66 } 67 } 68 69 return res; 70 } 71 72 int main() 73 { 74 int t; 75 76 scanf("%d",&t); 77 78 while (t--) 79 { 80 int n; 81 82 scanf("%d",&n); 83 84 ns.clear(); 85 ps.clear(); 86 87 for (int i = 0;i < n;i++) 88 { 89 g[i].clear(); 90 } 91 92 for (int i = 0;i < n;i++) 93 { 94 int a,b; 95 int x,y,z,w; 96 97 scanf("%d:%d",&a,&b); 98 scanf("%d%d%d%d",&x,&y,&z,&w); 99 100 int st = a * 60 + b; 101 int en = st + mabs(x - z) + mabs(y - w); 102 103 ns.push_back(node(st,en)); 104 ps.push_back(pii(x,y)); 105 ps.push_back(pii(z,w)); 106 } 107 108 for (int i = 0;i < n;i++) 109 { 110 for (int j = i + 1;j < n;j++) 111 { 112 pii st = ps[2*i + 1],en = ps[2*j]; 113 114 int cost = mabs(st.first - en.first) + mabs(st.second - en.second); 115 116 if (ns[i].en + cost < ns[j].st) g[i].push_back(n+j); 117 } 118 } 119 120 int ans = solve(n); 121 122 printf("%d\n",n - ans); 123 } 124 125 return 0; 126 }

uvalive 3126 Taxi Cab Scheme