题目链接Machine Schedule
有A和B两个机器,每个机器有不同工作模式,有很多任务,每个任务可以自在A上以mode_i运行或者是在B上以mode_j运行,每次换mode都要重启机器
给出k个任务,要求怎么安排才能让重启次数最少
最小点覆盖:
最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <vector>
using namespace std;
const int maxn=200+5;
const int maxk=1005;
int link[maxn+5];
bool vis[maxk];
int m,n,k;
vector<int>E[maxk];
int dfs(int u)
{
for(int i=0;i<E[u].size();i++){
int v=E[u][i];
if(!vis[v]){
vis[v]=true;
if(link[v]==-1||dfs(link[v])){
link[v]=u;
return 1;
}
}
}
return 0;
}
int hungry()
{
int ans=0;
memset(link,-1,sizeof(link));
for(int i=1;i<n;i++){
memset(vis,false,sizeof(vis));
ans+=dfs(i);
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int a,b,c;
while(scanf("%d",&n)!=EOF&&n){
scanf("%d%d",&m,&k);
for(int i=1;i<n;i++)E[i].clear();
for(int i=0;i<k;i++){
scanf("%d%d%d",&a,&b,&c);
if(b!=0&&c!=0)E[b].push_back(c);
}
printf("%d\n",hungry());
}
return 0;
}