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

题意:

有A,B两个机器,分别有n,m个档位,有k件工作,可以由x档位的A机器或者y档位的B机器完成。

问,可以改变完成工作的顺序,使切换档位的次数最小。

每件工作对应2个完成的档位,可以构建二分图,求图的最小点覆盖。

有向图:最小点覆盖=最大匹配

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2005
#define inf 1<<28
using namespace std;

int n;
vector<int>g1[Max];
bool visit[Max];
int match[Max];
void init(int n)
{
    int i;
    for(i=0; i<=n; i++)
    {
        g1[i].clear();
    }
}
int dfs1(int cur)
{
    int i;
    for(i=0; i<g1[cur].size(); i++)
    {
        int k=g1[cur][i];
        if(!visit[k])
        {
            visit[k]=1;
            if(match[k]==-1||dfs1(match[k]))
            {
                match[k]=cur;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,k,l,m;
    int x,y;
    while(scanf("%d",&k))
    {
        if(k==0)
            return 0;
        init(k);
        memset(match,-1,sizeof(match));
        scanf("%d%d",&m,&n);
        while(n--)
        {
            scanf("%d%d%d",&i,&x,&y);
            if(x==0||y==0)continue;//因为一开始档位在0,所以任何有0的工作都直接完成了,不需要再加进去,没写这个WA了3次。
            g1[x].push_back(y);
        }
        int num=0;
        for(i=0; i<k; i++)
        {
            memset(visit,0,sizeof(visit));
            num+=dfs1(i);
        }
        cout<<num<<endl;
    }
    return 0;
}

你可能感兴趣的:(POJ 1325 Machine Schedule 二分图最小点覆盖)