0
点赞
收藏
分享

微信扫一扫

LightOJ - 1206 Scheduling Taxi Cabs (二分图)


题目大意:给出N个行程,问能组成多少个DAG

解题思路:两个点集,找出最大匹配数,然后用N - 最大匹配数,就是DAG的数量了

#include <cstdio>
#include <cstring>
#include <cstdlib>
const int N = 510;

int n, cas = 1;
int startTime[N], a[N], b[N], c[N], d[N], cost[N], left[N];
bool g[N][N], vis[N];
void init() {
    scanf("%d", &n);
    char h1, h2, m1, m2;
    getchar();
    for (int i = 1; i <= n; i++) {
        scanf("%c%c:%c%c %d%d%d%d", &h1, &h2, &m1, &m2, &a[i], &b[i], &c[i], &d[i]);
        startTime[i] = ((h1 - '0') * 10 + h2 - '0' ) * 60 + (m1 - '0') * 10 + m2 - '0';
        cost[i] = abs(a[i] - c[i]) + abs(b[i] - d[i]);
        getchar();
    }
    memset(g, 0, sizeof(g));

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            if (i == j) continue;
            if (startTime[i] + cost[i] + abs(a[j] - c[i]) + abs(b[j] - d[i]) < startTime[j]) {
                g[i][j] = true;
            }
        }
}

bool dfs(int u) {
    for (int i = 1; i <= n; i++)
        if (g[u][i] && !vis[i]) {
            vis[i] = true;
            if (!left[i] || dfs(left[i])) {
                left[i] = u;
                return true;
            }
        }
    return false;
}

void solve() {
    memset(left, 0, sizeof(left));
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        memset(vis, 0, sizeof(vis));
        if (dfs(i)) ans++;
    }
    printf("Case %d: %d\n", cas++, n - ans);
}

int main() {
    int test;
    scanf("%d", &test);
    while (test--) {
        init();
        solve();
    }
    return 0;
}


举报

相关推荐

0 条评论