• pku3216 Repairing Company


    题意:

    修理公司的工人可以给城市中不同的工厂修理工具。给出各个工厂路径的邻接矩阵,和总任务数,还有每个工厂的工具修理需要的开始时间结束时间。问最少派出多少个工人可以完成所有任务?
    分析:跟pku2060几乎是一样的题目,只不过得用一次floyd算法任意俩点之间的最短路径
    View Code
    #include<iostream>

    using namespace std;

    int inf = 100000000;

    struct Task
    {
    int q;
    int s;
    int t;
    };

    Task tt[
    205];

    char mat[205][205];
    char vstd[205];
    int match[205];
    int nv;
    int dis[25][25]; //i到j的时间

    int path(int s)
    {
    int e;

    for(e = 1; e <= nv; e++)
    {
    if(mat[s][e] && !vstd[e])
    {
    vstd[e]
    = 1;
    if(match[e]==-1 || path(match[e]))
    {
    match[e]
    = s;
    return 1;
    }
    }
    }
    return 0;
    }

    int MaxMatch()
    {
    int s, res = 0;

    memset(match,
    -1, sizeof(match));

    for(s = 1; s <= nv; s++)
    {
    memset(vstd,
    0, sizeof(vstd));
    res
    += path(s);
    }

    return res;
    }

    bool Can(Task a, Task b)
    {
    if(a.s+a.t+dis[a.q][b.q] <= b.s)
    return true;
    return false;
    }

    int main()
    {
    int q;
    int i, j, k;
    while(scanf("%d %d", &q, &nv)==2 && (q||nv))
    {
    memset(dis,
    0, sizeof(dis));
    memset(mat,
    0, sizeof(mat));
    memset(tt,
    0, sizeof(tt));

    for(i = 1; i <= q; i++)
    {
    for(j = 1; j <= q; j++)
    {
    scanf(
    "%d", &dis[i][j]);
    if(dis[i][j] == -1) dis[i][j] = inf;
    }
    }

    for(k = 1; k <= q; k++)
    {
    for(i = 1; i <= q; i++)
    {
    for(j = 1; j <= q; j++)
    {
    if(dis[i][j] > dis[i][k] + dis[k][j])
    dis[i][j]
    = dis[i][k] + dis[k][j];
    }
    }
    }
    for(i = 1; i <= nv; i++)
    scanf(
    "%d %d %d", &tt[i].q, &tt[i].s, &tt[i].t);
    for(i = 1; i <= nv; i++)
    {
    for(j = 1; j <= nv; j++)
    {
    if(i==j) continue;
    if(Can(tt[i], tt[j]))
    {
    mat[i][j]
    = 1;
    }
    }
    }

    int res = nv - MaxMatch();

    printf(
    "%d\n", res);
    }
    return 0;
    }

  • 相关阅读:
    洛谷P3122 [USACO15FEB]圈住牛Fencing the Herd(计算几何+CDQ分治)
    洛谷P4502 [ZJOI2018]保镖(计算几何+三维凸包)
    [Codeforces1137D]Cooperative Game
    洛谷P2287 [HNOI2004]最佳包裹(三维凸包)
    洛谷P4724 【模板】三维凸包
    洛谷P4526 【模板】自适应辛普森法2(Simpson法)
    A + B Problem
    Java中方法next()和nextLine()的区别
    发现环
    分考场
  • 原文地址:https://www.cnblogs.com/nanke/p/2159723.html
Copyright © 2020-2023  润新知