Machine Schedule(Tyvj 3240 & POJ 1325)

原题

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

TYVJ 4340翻译

描述

众所周知,机器调度是计算机科学中的一个非常经典的问题,已经被研究了很长时间了。调度问题由于要满足的约束以及所要求的调度类型,存在着很大的不同。本题我们考虑2-机调度问题。

有两台机器A和B。机器A有n种工作模式,被称为mode_0, mode_1, …, mode_n-1,同样,机器B有m种工作模式,被称为mode_0, mode_1, … , mode_m-1。初始时两台机器在mode_0工作。
给出k项工作,每项工作可以在两台机器中的任一台以特定的模式被处理。例如,job 0可以或者在机器A以mode_3处理,或者在机器B以mode_4被处理,job 1可以或者在机器A以mode_2处理,或者在机器B以mode_4被处理,等等。则对job i,约束可以表示为一个三元组(i, x, y),表示job i可以在机器A以mode_ x处理,或者在机器B以mode_ y被处理。

显然,要完成所有的工作,我们就要一直转换机器的工作模式,但很不幸,机器工作模式的改变只有通过手工重启来进行。通过改变工作的序列,把每项工作安排给一台适当的机器。请您编写一个最小化重启机器次数的程序。

输入

输入包含若干测试用例。

每个测试用例的第一行给出3个正整数:n,m (n, m < 100)和k(k < 1000)。

后面的k行给出k项工作的约束,每行是一个三元组:i,x,y。
以一行给出单个0作为输入结束。

输出

输出一个整数一行,表示重启机器的最少次数。

题解

要A这道题,先A tyvj 3289。
源代码可根据 tyvj 3289 代码修改得来。

源码:

#include<iostream>
#include<string.h>
using namespace std;
int n,m,y[600],g[600][600],lk[600],ans=0,k,hh,a,b;

bool find(int v)
{
    for(int i=1; i<=m; i++)
        if(g[v][i] && !y[i])
        {
            y[i]=1;
            if(lk[i]==0 || find(lk[i]))
            {
                lk[i]=v;
                return true;
            }
        }
    return false;
}

int main()
{
    ios::sync_with_stdio(0);
    while(cin>>n, n)
    {
        memset(y,0,sizeof(y));
        memset(g,0,sizeof(g));
        memset(lk,0,sizeof(lk));
        ans=0;
        cin>>m>>k;
        for(int i=1; i<=k; i++)
        {
            cin>>hh>>a>>b;
            g[a][b]=1;
        } 
        for(int i=1; i<=n; i++)
        {
            memset(y,0,sizeof(y));
            if(find(i)) ans++;
        }
        cout<<ans<<endl;
    }
        return 0;
}

代码解释:

n,m分别为2部图两边节点的个数,两边的节点分别用1..n,1..m编号
g[x][y]表示x,y两个点之间有边相连
y[i]记录的是y中的i节点是否被访问过.
lk[y]记录的是当前与y节点相连的x节点

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值