POJ 2060 最小路径覆盖 二分图
2015-04-19 00:00
204 查看
这题是一道简单的最小路径覆盖题目,最小路径覆盖的数目等于点的数目减去最大匹配数。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #define maxn 505 #define mem(a) memset(a, 0, sizeof(a)) using namespace std; bool map[maxn][maxn], vis[maxn]; int lk[maxn], num; struct point { int st, sx, sy, ex, ey, dis; }po[maxn]; bool dfs(int a) { int i; for(i = 0;i < num;i++) { if(!vis[i]&&map[a][i]) { vis[i] = 1; if(lk[i] == -1||dfs(lk[i])) { lk[i] = a; return true; } } } return false; } int res() { int i; int ress = 0; memset(lk, -1, sizeof(lk)); for(i = 0;i < num;i++) { mem(vis); if(dfs(i)) ress++; } return ress; } int main(int argc, char *argv[]) { int cas, i, j, h, m, tmp, ans; scanf("%d", &cas); while(cas--) { ans = 0; mem(map); mem(po); scanf("%d", &num); for(i = 0;i < num;i++) { scanf("%d:%d%d%d%d%d", &h, &m, &po[i].sx, &po[i].sy, &po[i].ex, &po[i].ey); po[i].st = h * 60 + m; po[i].dis = abs(po[i].sx - po[i].ex) + abs(po[i].sy - po[i].ey); } for(i = 0;i < (num - 1);i++) { for(j = (i + 1);j < num;j++) { tmp = abs(po[i].ex - po[j].sx) + abs(po[i].ey - po[j].sy); if((po[i].st + po[i].dis + tmp) < po[j].st) map[i][j] = 1; } } ans = res(); printf("%d\n", num - ans); } return 0; }
相关文章推荐
- poj 2060 二分图 最小路径覆盖 出租车
- 二分图变种之最小路径覆盖、最小点覆盖集【poj3041】【poj2060】
- POJ - 2060 Taxi Cab Scheme 二分图 最小路径覆盖
- HDU 1350 & HDU 1960 & POJ 2060 Taxi Cab Scheme【二分图之最小路径覆盖,经典】
- 二分图最小路径覆盖--poj2060
- Poj-2060 Taxi Cab Scheme 二分图最小路径覆盖
- 【二分图+最小路径覆盖+注释】北大 poj 2060 Taxi Cab Scheme
- 二分图最小路径覆盖--poj2060 Taxi Cab Scheme
- POJ2060 Taxi Cab Scheme【二分图最小路径覆盖】
- poj 2060 Taxi Cab Scheme(DAG图的最小路径覆盖)
- POJ 2060 最小路径覆盖
- POJ 1548 (二分图+最小路径覆盖)
- POJ 3020 Antenna Placement(二分图最小路径覆盖)
- POJ 2060 最小覆盖路径
- POJ:2060-Taxi Cab Scheme(最小路径覆盖)
- POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)
- POJ-2060-Taxi Cab Scheme-最小路径覆盖
- POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖)
- 【最小路径覆盖】POJ 2060
- poj 2594 二分图 Floyd闭包+最小路径覆盖