zoukankan      html  css  js  c++  java
  • poj2060

    最小路径覆盖,把每个ride看成一个点,如果两个ride可以先后由一辆车完成,那么就从前一个ride引一条边到后一个ride。

    在最小路经覆盖中,原图的邻接矩阵和二分图匹配的邻接矩阵为同一矩阵

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    #define maxn 505
    
    struct Elem
    {
        int x1, y1, x2, y2;
        int s, e;
    } ride[maxn];
    
    int n;
    int uN, vN;
    bool g[maxn][maxn];
    int xM[maxn], yM[maxn];
    bool chk[maxn];
    
    int cal(int h, int m)
    {
        return h * 60 + m;
    }
    
    int dist(int x1, int y1, int x2, int y2)
    {
        return abs(x1 - x2) + abs(y1 - y2);
    }
    
    void input()
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            int h, m;
            scanf("%d:%d", &h, &m);
            ride[i].s = cal(h, m);
            scanf("%d%d%d%d", &ride[i].x1, &ride[i].y1, &ride[i].x2, &ride[i].y2);
            ride[i].e = ride[i].s + dist(ride[i].x1, ride[i].y1, ride[i].x2, ride[i].y2);
        }
    }
    
    bool ok(Elem &a, Elem &b)
    {
        return dist(a.x2, a.y2, b.x1, b.y1) + a.e < b.s;
    }
    
    void make()
    {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                g[i][j] = ok(ride[i], ride[j]);
    }
    
    bool SearchPath(int u)
    {
        int v;
        for (v = 0; v < vN; v++)
            if (g[u][v] && !chk[v])
            {
                chk[v] = true;
                if (yM[v] == -1 || SearchPath(yM[v]))
                {
                    yM[v] = u;
                    xM[u] = v;
                    return true;
                }
            }
        return false;
    }
    
    int MaxMatch()
    {
        int u, ret = 0;
        memset(xM, -1, sizeof(xM));
        memset(yM, -1, sizeof(yM));
        for (u = 0; u < uN; u++)
            if (xM[u] == -1)
            {
                memset(chk, false, sizeof(chk));
                if (SearchPath(u))
                    ret++;
            }
        return ret;
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        int t;
        scanf("%d", &t);
        while (t--)
        {
            input();
            make();
            uN = vN = n;
            printf("%d\n", n - MaxMatch());
        }
        return 0;
    }
  • 相关阅读:
    jq 获取下一个兄弟原素 下拉箭头旋转
    weui复选框无法传值
    小乌龟 coding 克隆、提交一直提示无权限
    mysql 时间操作
    Mysql表结构导出excel(含数据类型、字段备注注释)
    sql server数据库文件的迁移(mdf&ldf文件)
    thinkphp 5 _initialize 使用问题
    thinkphp5 or
    找实习与校招总结——经验与收获2021
    千兆网数据CRC检验和过滤
  • 原文地址:https://www.cnblogs.com/rainydays/p/2578333.html
Copyright © 2011-2022 走看看