B - Machine Schedule

在一個工廠,有兩臺機器A,
B生產產品。A機器有n種工作模式(模式0,模式1....模式n-1)。 

B機器有m種工作模式(模式0,模式1....模式m-1)。
現在要加工k個產品。每個產品可以由兩 臺機器特定的模式生產。
例如:產品0,可以由A機器在3號模式或B機器4號模式生產。

   兩臺機器初始模式都在模式0,但是,這兩臺機器不是很先進,如果需要切換模式,只能由

人手工切換模式,手工切換可以切換到任意模式。求加工完k個產品需要切換模式的最少次數。

(生產產品的順序可以任意)

Input

這裏有多組測試。每組測試第一行輸入 n,m, k。(n,m<100),(k<1000)

      接下來k行,給出k個產品(i,x,y).即第i個產品可以由A機器的x模式生產或B機器的y模式生產。

      輸入單個0, 測試結束。

Output

輸出切換模式最少次數。

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

題解:套個板子ac

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
int n, m ,k;
const int maxn = 1e3+9;
int line[maxn][maxn];
int used[maxn];
int nxt[maxn];
bool find(int x)
{
    for(int i = 1;i <= m;++i)
    {
        if(line[x][i] && !used[i])
        {
            used[i] = 1;
            if(nxt[i] == -1 || find(nxt[i]))
            {
                nxt[i] = x;
                return true;
            }
        }
    }
    return false;
}
int match()
{
    int sum = 0;
    for(int i = 1;i <= n;++i)
    {
        memset(used, 0, sizeof(used));
        if(find(i))
        {
            sum++;
        }
    }
    return sum;
}
int main()
{

    while(~scanf("%d", &n))
    {
        if(n == 0)
        {
            return 0;
        }
        memset(line, 0, sizeof(line));
        memset(nxt, -1, sizeof(nxt));
        scanf("%d%d",&m, &k);
        int x, y;
        for(int i = 0;i < k;++i)
        {
            scanf("%d%d%d", &i, &x, &y);
            if(x == 0 || y == 0)
            {
                continue;
            }
            line[x][y] = 1;
        }
        cout << match() <<endl;
    }

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章