zoukankan      html  css  js  c++  java
  • 【POJ1698】Alice's Chance-二分图多重匹配

    测试地址:Alice's Chance

    题目大意:演员Alice接到N个拍电影任务,一部电影在一周中只有某些日子能拍,并且每部电影都有一定的任务(至少要拍D天)和期限(在W周内拍完),而Alice一天只能去拍一部电影,求能不能制定一个排片计划,使得Alice能够接下所有拍电影的任务。

    做法:从题目中可以看出,电影与每一天之间是一对多的匹配关系,因此可以用二分图模型中的多重匹配来解决,代码写起来很像匈牙利算法。

    以下是本人代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int T,n,limit[25],able[10],bmap[25][510],maxw;
    int cx[510],cy[25][510];
    bool vis[25];
    
    bool findpath(int u)
    {
      for(int i=1;i<=n;i++)
      {
        if (bmap[i][u]&&!vis[i])
    	{
    	  vis[i]=1;
    	  if (cy[i][0]<limit[i])
    	  {
    	    cy[i][++cy[i][0]]=u;
    		return 1;
    	  }
    	  else
    	  {
    	    for(int j=1;j<=cy[i][0];j++)
    		  if (findpath(cy[i][j]))
    		  {
    		    cy[i][j]=u;
    		    return 1;
    	      }
    	  }
    	}
      }
      return 0;
    }
    
    bool mulmatch()
    {
      int ans=0,s=0;
      memset(cx,0,sizeof(cx));
      memset(cy,0,sizeof(cy));
      for(int i=1;i<=maxw*7;i++)
      {
        memset(vis,0,sizeof(vis));
        if (!cx[i])
    	{
    	  if (findpath(i)) ans++;
        }
      }
      for(int i=1;i<=n;i++) s+=limit[i];
      return ans==s;
    }
    
    int main()
    {
      scanf("%d",&T);
      while(T--)
      {
        memset(bmap,0,sizeof(bmap));
        scanf("%d",&n);
    	maxw=0;
    	for(int i=1,w;i<=n;i++)
    	{
    	  memset(able,0,sizeof(able));
    	  for(int j=1;j<=7;j++) scanf("%d",&able[j]);
    	  scanf("%d%d",&limit[i],&w);
    	  maxw=max(w,maxw);
    	  for(int j=1;j<=7;j++)
    	    if (able[j])
    		{
    	      for(int k=0;k<w;k++)
    		    bmap[i][k*7+j]=1;
    	    }
    	}
    	
    	if (mulmatch()) printf("Yes
    ");
    	else printf("No
    ");
      }
      
      return 0;
    }
    


  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793836.html
Copyright © 2011-2022 走看看