Machine Schedule HDU1150

有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。

所以这题求的是 二分图的最大覆盖点

最小覆盖点==最大匹配数

一开始为机器状态为0  所以0无需任何代价  不需要计算在内

#include<bits/stdc++.h>
using namespace std;

int mp[105][105];
int used[106];
int vis[105];//记录的是匹配情况 
int n,m;
bool find1(int  x)
{
    for(int j=1;j<m;j++)//从1开始是因为0不需要计算在内
    {
        if(mp[x][j]&&!used[j])
        {
            used[j]=1;
            if(!vis[j]||find1(vis[j]))
              {
                  vis[j]=x;
                  return true;
              }
        }
    }
    return false;
}


int main()
{
    int k,cas,x,y;
    while(scanf("%d",&n),n)
    {
        memset(mp,0,sizeof(mp));
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&m,&k);
        while(k--)
        {
            scanf("%d%d%d",&cas,&x,&y);
            mp[x][y]=1;
        }
        int ans=0;
        for(int i=1;i<n;i++)
        {
            memset(used,0,sizeof(used));//每次的使用  需要清除
            if(find1(i))ans++;
        }
        printf("%d\n",ans);
    }

}

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10361618.html