Poj1325 Machine Schedule機器調度

Poj1325 Machine Schedule機器調度

Position:


List

Description

  我們知道機器調度是計算機科學中一個非常經典的問題。調度問題有很多種,具體條件不同,問題就不同。現在我們要處理的是兩個機器的調度問題。
  有兩個機器A和B。機器A有n種工作模式,我們稱之爲mode_0,mode_l,……,mode_n-1。同樣,機器B有m種工作模式,我們稱之爲mode_0,mode_1,……,mode_m-1。初始時,兩臺機器的工作模式均爲mode_0。現在有k個任務,每個工作都可以在兩臺機器中任意一臺的特定的模式下被加工。例如,job0能在機器A的mode_3或機器B的mode_4下被加工,jobl能在機器A的mode_2或機器B的mode_4下被加工,等等。因此,對於任意的jobi,我們可以用三元組(i,x,y)來表示jobi在機器A的mode_x或機器B的mode_y下被加工。
  顯然,要完成所有工作,我們需要不時的改變機器的工作模式。但是,改變機器的工作狀態就必須重啓機器,這是需要代價的。你的任務是,合理的分配任務給適當的機器,使機器的重啓次數儘量少。

Input

第一行三個整數n,m(n,m<=100),k(k<6000)。接下來的k行,每行三個整數i,x,y。

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

Sample Output

3

HINT

30%: n,m<30, k<100
100%: n,m<100,k<10000

Solution

二分圖匹配直接上(Dinic||匈牙利)
Analysis:Konig 定理:最大匹配數 = 最小點覆蓋數
注意開始機器是開着的,兩邊都爲零,所以連的邊都可以去掉
可惡的樣例,居然沒0,然後rank10->rank22,80分啊!
ks9.23

Code

// <machine.cpp> - Fri Sep 23 08:09:06 2016
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is.

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define MOD 1000000007
#define INF 1e9
using namespace std;
typedef long long LL;
const int MAXN=210;
const int MAXM=100010;
inline int max(int &x,int &y) {return x>y?x:y;}
inline int min(int &x,int &y) {return x<y?x:y;}
inline int gi() {
    register int w=0,q=0;register char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')q=1,ch=getchar();
    while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
    return q?-w:w;
}
int n,match[MAXN];
vector<int>b[MAXN];bool f[MAXN];
inline void add(int v,int u){
    if(!(v&&u))return;//這句話頂80分,坑~
    b[u].push_back(v+n);b[v+n].push_back(u);
}
inline bool dfs(register int x){
    if(f[x])return 0;
    int num=b[x].size();f[x]=true;
    for(int i=0;i<num;i++){
        int nex=b[x][i];
        if(match[nex]==-1||dfs(match[nex])){
            match[x]=nex;match[nex]=x;return 1;
        }
    }
    return 0;
}
int main()
{
    freopen("machine.in","r",stdin);
    freopen("machine.out","w",stdout);
    while(n=gi(),n){
        int ans=gi(),k=gi();
        for(int i=0;i<=ans+n;i++)b[i].clear();
        for(int i=1;i<=k;i++)ans=gi(),add(gi(),gi());
        for(int i=0;i<MAXN;i++)match[i]=-1;ans=0;
        for(int i=0;i<n;i++)
            if(match[i]==-1){
                memset(f,0,sizeof(f));
                if(dfs(i))ans++;
            }
        printf("%d\n",ans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章