Language:Default Machine Schedule
Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling problems differ widely in the nature of the constraints that must be satisfied and the type of schedule desired. Here we consider a 2-machine scheduling problem. Input The input file for this program consists of several configurations. The first line of one configuration contains three positive integers: n, m (n, m < 100) and k (k < 1000). The following k lines give the constrains of the k jobs, each line is a triple: i, x, y. Output The output should be one integer per line, which means the minimal times of restarting machine. |
题目大意:现在有 两台机器,A,B以及N个任务,每个机器都是有M种不同的模式,对于每个机器,如果要想解决第i个任务,那么他就要变为a[i] 或者是b[i]的模式,现在问你最少变换模式多少次能够把N个任务完成
思路:这道题目我们可以看做是每一个任务,要么放在A上完成,要么放在B上面完成,二者选其一,那么我们可以把机器A的m中模式作为左部集合,B的m中模式作为右部集合,每个任务就作为他们两个之间的桥梁,因为是AB中选择一个即可,也就是说我们要把N个任务完成的边要求出的就是最小的定点数,就是最小点覆盖
需要注意,一开始机器的状态是0的,如果有的任务一开始有A或者是B为0的情况, 免去建边了,
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=100+10;
vector<int >G[maxn];
int pre[maxn];
int vis[maxn];
bool DFS(int u)
{
for(int i=0; i<G[u].size(); i++)
{
int v=G[u][i];
if(vis[v])
continue;
vis[v]=1;
if(!pre[v]||DFS(pre[v]))
{
pre[v]=u;
return true;
}
}
return false;
}
int main()
{
int n,m,k;
while(scanf("%d",&n)&&n)
{
scanf("%d%d",&m,&k);
memset(pre,0,sizeof(pre));
for(int i=0;i<=n;i++)G[i].clear();
int pos,a,b;
for(int i=1; i<=k; i++)
{
scanf("%d%d%d",&pos,&a,&b);
if(a>0&&b>0)
G[a].push_back(b);
}
int ans=0;
for(int i=0; i<n; i++)
{
memset(vis,0,sizeof(vis));
if(DFS(i))
ans++;
}
printf("%d\n",ans);
}
}