码迷,mamicode.com
首页 > 其他好文 > 详细

poj1325

时间:2017-07-15 15:54:18      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:match   有一个   cstring   模式   匹配   覆盖   return   任务   names   

给出一系列任务,每个任务可以在机器A的某个模式,或者在机器B的某个模式下完成。机器A和B每切换一次模式需要重启一次。问完成这些任务,最少需要重启机器多少次?

把任务看作边 “重启”操作看作点

这道题就是一个裸的二分图最小点覆盖

然后呢 最小点覆盖 NP完全问题

然后呢 二分图中 最小点覆盖等于最大匹配

我真是做TMD无敌棒槌终极骚猪喷香油水水之终极猪皮皮之麻辣臭皮小骚猪

好的好的随便写个匈牙利10分钟AC

技术分享
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;


const int Max=105;
int n,m,yM[Max];
bool vis[Max],map[Max][Max];


bool SearchPath(int u)
{
 for(int v=1;v<m;v++)
  if(!vis[v] && map[u][v])
  {
   vis[v]=true;
   if(yM[v]==-1 || SearchPath(yM[v]))
   {
    yM[v]=u;
    return true;
   }
  }
 return false;
}


int MaxMatch()
{
 int u,ret=0;
 memset(yM,-1,sizeof(yM));
 for(u=1;u<n;u++)
 {
  memset(vis,false,sizeof(vis));
  if(SearchPath(u))
   ret++;
 }
    return ret;
}


int main()
{
 int i,k,u,v;
 while(scanf("%d",&n),n)
 {
  scanf("%d%d",&m,&k);
  memset(map,0,sizeof(map));
  while(k--)
  {
   scanf("%d%d%d",&i,&u,&v);
   if(u!=0&&v!=0) //如果有一个有0,则这个工作不用重启时间
    map[u][v]=1;
  }
        cout<<MaxMatch()<<endl;
 }
 return 0;
}
View Code

 

poj1325

标签:match   有一个   cstring   模式   匹配   覆盖   return   任务   names   

原文地址:http://www.cnblogs.com/Kong-Ruo/p/7182727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!