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

POJ 3216 二分匹配

(2010-09-18 21:11:18)
标签:

poj

3216

二分匹配

it

分类: 图论

题目描述:

q个地点。 m个任务。 每个任务有ptd三个属性。P表示任务的地点(1~q),t表示任务的开始时间,d表示任务的需要时间。

告诉你这q个地点间相互之间的距离。

问你至少需要多少个人来完成任务。

解题报告:

二分匹配:

左边右边各m个点。

如果j任务可以在i任务之后继续开始(i任务结束后,再赶到j任务的地点仍能早于j任务的开始时间)

那么连接i(左边),j(右边)

最坏的情况是每个任务都需要安排一个人。

那么,这样的建图,每连一条边表示可以节省一个人。

连接多少条边就是节省多少人。二分匹配解之。

 

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int q, m, g[20][20], x[200][3];
int match[200], vst[200], gg[200][200];
int find(int u)
{
    for(int i = 0; i < m; i )
        if (!vst[i] && gg[u][i])
        {
            vst[i] = 1;
            if (match[i] == -1 || find(match[i]) == 1)
            {
                match[i] = u;
                return 1;
            }
        }
    return 0;
}
int solve()
{
    memset(match, -1, sizeof(match));
    int ans = 0;
    for(int i = 0; i < m; i )
    {
        memset(vst, 0, sizeof(vst));
        ans = find(i);
    }
    return ans;
}
int main()
{
    while(scanf("%d%d", &q, &m) && (q || m))
    {
        for(int i = 0; i < q; i )
            for(int j = 0; j < q; j ) scanf("%d", &g[i][j]);
        for(int k = 0; k < q; k )
            for(int i = 0; i < q; i )
                for(int j = 0; j < q; j )
                    if (g[i][k] != -1 && g[k][j] != -1 && (g[i][j] == -1 || g[i][k] g[k][j] < g[i][j]))
                        g[i][j] = g[i][k] g[k][j];
        for(int i = 0; i < m; i )
            scanf("%d%d%d", &x[i][0], &x[i][1], &x[i][2]), x[i][0]--;
        memset(gg, 0, sizeof(gg));
        for(int i = 0; i < m; i )
            for(int j = 0; j < m; j )
                if (i != j)
                {
                    if (g[x[i][0]][x[j][0]] != -1 && x[i][1] x[i][2] g[x[i][0]][x[j][0]] <= x[j][1])
                        gg[i][j] = 1;
                }
        printf("%d\n", m - solve());
    }
    return 0;
}

0

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

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

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

新浪公司 版权所有