POJ 1325 Machine Schedule (二分图最小点集覆盖 匈牙利算法)

Machine Schedule

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 12621   Accepted: 5399

Description

As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling problems differ widely in the nature of the constraints that
must be satisfied and the type of schedule desired. Here we consider a 2-machine scheduling problem.

There are two machines A and B. Machine A has n kinds of working modes, which is called mode_0, mode_1, ..., mode_n-1, likewise machine B has m kinds of working modes, mode_0, mode_1, ... , mode_m-1. At the beginning they are both work at mode_0.

For k jobs given, each of them can be processed in either one of the two machines in particular mode. For example, job 0 can either be processed in machine A at mode_3 or in machine B at mode_4, job 1 can either be processed in machine A at mode_2 or in machine
B at mode_4, and so on. Thus, for job i, the constraint can be represent as a triple (i, x, y), which means it can be processed either in machine A at mode_x, or in machine B at mode_y.

Obviously, to accomplish all the jobs, we need to change the machine‘s working mode from time to time, but unfortunately, the machine‘s working mode can only be changed by restarting it manually. By changing the sequence of the jobs and assigning each job to
a suitable machine, please write a program to minimize the times of restarting machines.

Input

The input file for this program consists of several configurations. The first line of one configuration contains three positive integers: n, m (n, m < 100) and k (k < 1000). The following k lines give
the constrains of the k jobs, each line is a triple: i, x, y.

The input will be terminated by a line containing a single zero.

Output

The output should be one integer per line, which means the minimal times of restarting machine.

Sample Input

5 5 10
0 1 1
1 1 2
2 1 3
3 1 4
4 2 1
5 2 2
6 2 3
7 2 4
8 3 3
9 4 3
0

Sample Output

3

Source

Beijing 2002

题目链接:http://poj.org/problem?id=1325

题目大意:两个机器,每个作业可以在不同机器的不同模式下工作,A x y表示作业A可以由机器1的x模式或者机器2的y模式完成,要完成所有作业,必须不断切换机器模式,试寻找适合的分配关系使得切换次数最小,注意机器1和机器2开始都工作在0模式,求最小次数

题目分析:二分图最小点集覆盖问题,1和2两个机器作为二分图的两边,按每个工作对应的1,2机器模式建边,然后就是求这个二分图的最小点覆盖,即最小的点集,使得其包含所有的边,根据二分图的最小点集覆盖数=最大匹配,所以直接用匈牙利算法求解最大匹配即可,注意0模式时不要连边即可

#include <cstdio>
#include <cstring>
int const MAX = 105;
bool g[MAX][MAX];
int cx[MAX], cy[MAX];
bool vis[MAX];
int n, m, k;

int DFS(int x)
{
    for(int y = 0; y < m; y++)
    {
        if(!vis[y] && g[x][y])
        {
            vis[y] = true;
            if(cy[y] == -1 || DFS(cy[y]))
            {
                cx[x] = y;
                cy[y] = x;
                return 1;
            }
        }
    }
    return 0;
}

int MaxMatch()
{
    int res = 0;
    memset(cx, -1, sizeof(cx));
    memset(cy, -1, sizeof(cy));
    for(int i = 0; i < n; i++)
    {
        if(cx[i] == -1)
        {
            memset(vis, false, sizeof(vis));
            res += DFS(i);
        }
    }
    return res;
}

int main()
{
    while(scanf("%d", &n) != EOF && n)
    {
        memset(g, false, sizeof(g));
        scanf("%d %d", &m, &k);
        for(int i = 0; i < k; i++)
        {
            int tmp, x, y;
            scanf("%d %d %d", &tmp, &x, &y);
            if(x * y)
                g[x][y] = true;
        }
        int ans = MaxMatch();
        printf("%d\n", ans);
    }
}
时间: 2024-08-02 11:01:26

POJ 1325 Machine Schedule (二分图最小点集覆盖 匈牙利算法)的相关文章

POJ 1422 Air Raid (二分图最小点集覆盖 匈牙利算法)

Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7236   Accepted: 4295 Description Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an i

POJ - 1325 Machine Schedule 二分图 最小点覆盖

题目大意:有两个机器,A机器有n种工作模式,B机器有m种工作模式,刚开始两个机器都是0模式,如果要切换模式的话,机器就必须的重启 有k个任务,每个任务都可以交给A机器的i模式或者B机器的j模式完成,问要重启多少次机器才能完成任务 解题思路:两个机器的点分为两个点集,点集之间的关系就是任务了,要将所有任务都完成,就要将所有边都覆盖掉,所以就是求最小点覆盖了. 这里有一个点要注意,如果所有任务中都有一个0,那么机器就不用重启了,重启次数就为0了(因为刚开始都是0) #include<cstdio>

POJ 1325 Machine Schedule 二分图最大匹配

把每一个任务看做一个边,机器的模式看做是一个点,这个其实就是求一个最少点覆盖所有边即最小点覆盖集的问题,因为最小点覆盖集=二分图的最大匹配,所以问题转化成了求二分图最大匹配问题. 第一次写二分图匹配,感觉建模还是相当困难的. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <strin

POJ 1325 Machine Schedule【最小点覆盖】

E - Machine Schedule Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1325 Appoint description:  System Crawler  (2014-08-10) Description As we all know, machine scheduling is a very classical pr

POJ 1325 Machine Schedule (最小点覆盖 &amp;&amp; 二分图最大匹配)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">鏈接: http://poj.org/problem?id=1325</span> Description As we all know, machine scheduling is a very classical problem in computer science a

poj 1325 Machine Schedule 二分图匹配+DFS实现

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <ma

hdu 1150 Machine Schedule(二分图-最小顶点覆盖)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5424    Accepted Submission(s): 2691 Problem Description As we all know, machine scheduling is a very classical problem in compu

poj 1325 Machine Schedule 解题报告

题目链接:http://poj.org/problem?id=1325 题目意思:有 k 个作业,机器A有 n 个模式:0 ~ n-1,机器B 有 m 个模式:0~ m-1.每一个作业能运行在 A 的 某一个模式(假设为 i (0 <= i <= n-1 ) )或 B 的某一个模式下(j (0 <= j <= m-1)).多个作业可以同时运行在 A 的某一个 模式下,当然 B 也如此.每对A 或 B 转换一次模式,就要重启一次 A 或者 B,你需要选择A 或 B 的一些模式,使得所

HDU 1150:Machine Schedule(二分匹配,匈牙利算法)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5371    Accepted Submission(s): 2658 Problem Description As we all know, machine scheduling is a very classical problem in compu