加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 2060 图论 最小路径覆盖

(2010-08-09 10:04:30)
标签:

poj

pku

2060

图论

最小路径覆盖

it

分类: 图论

题目描述:

现在有m个运输任务,

每个任务有开始时间,开始坐标,结束坐标3个属性。

如果一辆车要连续进行2个或多个运输任务,那么它赶到那个运输任务的起点时间要小于那个任务的开始时间。

问至少需要多少车才能完成所有的运输任务。

解题报告:

最小路径覆盖:

把每个运输任务看成2个点i和i',

如果任务a和b能够连续进行,那么连接a和b'。

点数减去匹配数目就是答案。

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
#define siz 1000
int n, m, t, mm, x[siz][6], match[siz];
vector<int> g[siz];
bool vst[siz];
char str[10];
int myabs(int xx){if (xx >= 0) return xx; else return -xx;}
void judge(int id)
{
    x[id][0] = ((str[0] - '0') * 10 + str[1] - '0') * 60 + (str[3] - '0') * 10 + str[4] - '0';
    x[id][5] = x[id][0] + myabs(x[id][1] - x[id][3]) + myabs(x[id][2] - x[id][4]);
}
bool jeogia(int i, int j)
{
    int tmp = x[i][5] + myabs(x[j][1] - x[i][3]) + myabs(x[j][2] - x[i][4]);
    if (tmp <= 1439 && tmp < x[j][0]) return true;
    return false;
}
int find(int u)
{
    for(int i = 0; i < g[u].size(); i++)
        if (!vst[g[u][i]])
        {
            vst[g[u][i]] = 1;
            if (match[g[u][i]] == -1 || find(match[g[u][i]]))
            {
                match[g[u][i]] = u;
                return 1;
            }
        }
    return 0;
}
int solve()
{
    memset(match, -1, sizeof(match));
    int ans = 0;
    for(int i = 0; i < n; i++)
    {
        memset(vst, 0, sizeof(vst));
        ans += find(i);
    }
    return ans;
}
int main()
{
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &mm);
        for(int i = 0; i < (mm << 1); i++) g[i].clear();
        for(int i = 0; i < mm; i++)
            scanf("%s%d%d%d%d", str, &x[i][1], &x[i][2], &x[i][3], &x[i][4]), judge(i);
        for(int i = 0; i < mm; i++)
            for(int j = 0; j < mm; j++)
                if (i != j && jeogia(i, j))
                    g[i].push_back(j);
        n = m = (mm << 1);
        printf("%d\n", mm - solve());
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有