hdu 1150 最小点覆盖

时间:2021-04-11 00:29:37
题目大意;有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。
 
注意状态为0的即可
 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN = ;
int uN,vN;//u,v的数目,使用前面必须赋值
int g[MAXN][MAXN];//邻接矩阵
int linker[MAXN];
bool used[MAXN];
bool dfs(int u)
{
for(int v = ; v < vN;v++)
if(g[u][v] && !used[v])
{
used[v] = true;
if(linker[v] == - || dfs(linker[v]))
{
linker[v] = u;
return true;
}
}
return false;
}
int hungary()
{
int res = ;
memset(linker,-,sizeof(linker));
for(int u = ;u < uN;u++)
{
memset(used,false,sizeof(used));
if(dfs(u))res++;
}
return res;
}
int main()
{
int i,j,k;
//freopen("1.in","r",stdin);
while(scanf("%d",&uN)!=EOF)
{
if(uN==) break;
scanf("%d%d",&vN,&k);
int p,q;
memset(g,,sizeof(g));
while(k--)
{
scanf("%d%d%d",&i,&p,&q);
if(p>&&q>) g[p][q]=;
}
printf("%d\n",hungary());
}
return ;
}